在R中创建多个数据集

时间:2012-11-12 10:17:16

标签: r dataframe

我有一个包含5个变量(v1, v2, v3, v4, v5)的巨大data.frame。我需要根据单个变量创建几个子集。例如:

DATA
v1   v2    v3 ... 
1    1231  0.1
1    2653  0.3
1    4545  0.4
2    4545  0.6
2    3345  0.1
2    5675  0.7
3    6754  0.2
3    9989  0.85
3    3456  0.4
.
.
.
70000
70000
70000

我想使用一个能够以自动方式轻松生成每个数据集的函数为v1上的每个值创建子集,因为我对此变量进行了70000多次测量。然后,一旦我有数据集,我想对v2和v3执行相关,并在单独的列中输出p值和rho。对不起,我还没有尝试任何命令,但是我很难理解如何生成函数。

2 个答案:

答案 0 :(得分:2)

这是一个R Base解决方案

DF <- read.table(text="v1   v2    v3 
1    1231  0.1
1    2653  0.3
1    4545  0.4
2    4545  0.6
2    3345  0.1
2    5675  0.7
3    6754  0.2
3    9989  0.85
3    3456  0.4", header=TRUE)

# Correlations and P-values
Result <- sapply(split(DF[,-1], DF$v1), function(x)
        c(cor.test(x$v2, x$v3)$estimate, P.val=cor.test(x$v2, x$v3)$p.value))

Result
              1         2         3
cor   0.9632826 0.9393458 0.6717314
P.val 0.1730489 0.2228668 0.5311018

如果您想将这些Result添加到原始data.frame,请使用transform()

transform(DF, 
          correlation=rep(Result[1,], table(DF[,1])),
          Pval=rep(Result[2,], table(DF[,1])))
  v1   v2   v3 correlation      Pval
1  1 1231 0.10   0.9632826 0.1730489
2  1 2653 0.30   0.9632826 0.1730489
3  1 4545 0.40   0.9632826 0.1730489
4  2 4545 0.60   0.9393458 0.2228668
5  2 3345 0.10   0.9393458 0.2228668
6  2 5675 0.70   0.9393458 0.2228668
7  3 6754 0.20   0.6717314 0.5311018
8  3 9989 0.85   0.6717314 0.5311018
9  3 3456 0.40   0.6717314 0.5311018

答案 1 :(得分:2)

plyr包具有一些很好的功能来执行此类分析,最重要的是现在ddply

res = ddply(DF, .(v1), function(sub_data) {
   cor_result = cor.test(sub_data$v2, sub_data$v3)
   return(data.frame(p.value = cor_result$p.value, rho = cor_result$estimate))
})

> res
  v1   p.value       rho
1  1 0.1730489 0.9632826
2  2 0.2228668 0.9393458
3  3 0.5311018 0.6717314

请注意,您需要使用cor.test才能获得p值。