2

我有一个带有 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。抱歉,我还没有尝试任何命令,但我在理解如何生成函数时遇到了麻烦。

4

2 回答 2

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

如果您想将这些Results 添加到原始 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
于 2012-11-12T10:22:40.310 回答
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 值。

于 2012-11-12T10:33:45.953 回答