我有一个包含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。对不起,我还没有尝试任何命令,但是我很难理解如何生成函数。
答案 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值。