R 如何组合数据帧,其中包含跨多个变量和多个组的多个统计信息?
我使用以下代码从mtcars相关性计算斯皮尔曼r值:R 如何组合数据帧,其中包含跨多个变量和多个组的多个统计信息?,r,correlation,p-value,tidyverse,R,Correlation,P Value,Tidyverse,我使用以下代码从mtcars相关性计算斯皮尔曼r值: library(plyr) library(dplyr) mtcars[mtcars==3.440] <- NA mtcars[mtcars==4.22] <- NA mtcars[mtcars==18.90] <- NA selected <- select(mtcars, "cyl", "disp", "wt") mtcars$cyl <- as.factor(mtcars$cyl) for
library(plyr)
library(dplyr)
mtcars[mtcars==3.440] <- NA
mtcars[mtcars==4.22] <- NA
mtcars[mtcars==18.90] <- NA
selected <- select(mtcars, "cyl", "disp", "wt")
mtcars$cyl <- as.factor(mtcars$cyl)
for (i in "cyl") {
co <- ddply(na.omit(selected), i, function(adf) cor(adf[,2], adf[,3], method ="spearman"))
names(co) <- c('cyl',paste('CorCol',i, sep='_'))
if(exists('odf')) {
odf <- merge(odf, co, by='cyl', all=TRUE)} else {
odf <- co } }
colnames(odf)[colnames(odf)=="CorCol_cyl"] <- "wt"
selected <- select(mtcars, "cyl", "disp", "qsec")
for (i in "cyl") {
co <- ddply(na.omit(selected), i, function(adf) cor(adf[,2], adf[,3], method ="spearman"))
names(co) <- c('cyl',paste('CorCol',i, sep='_'))
if(exists('odf')) {
odf <- merge(odf, co, by='cyl', all=TRUE)} else {
odf <- co } }
colnames(odf)[colnames(odf)=="CorCol_cyl"] <- "qsec"
selected <- select(mtcars, "cyl", "disp", "drat")
for (i in "cyl") {
co <- ddply(na.omit(selected), i, function(adf) cor(adf[,2], adf[,3], method ="spearman"))
names(co) <- c('cyl',paste('CorCol',i, sep='_'))
if(exists('odf')) {
odf <- merge(odf, co, by='cyl', all=TRUE)} else {
odf <- co } }
colnames(odf)[colnames(odf)=="CorCol_cyl"] <- "drat"
这正是我想要的。但是,我还想生成两个额外的数据帧,其中一个相同,但它显示的不是Spearman r值,而是Spearman p值。另一个也是相同的,但它显示了样本大小,即每个样本的比较次数
如果有任何建议,我将不胜感激。谢谢。我提出了一个利用列表列的解决方案(一次处理所有三个cyl
组):
- 我使用
在三个groupby()
组上“循环”,而不是显式的cyl
循环
- 我使用
,它一步给出相关性和p值。(注意,我没有使用斯皮尔曼相关性,因为mtcars数据集中存在联系。您可以根据实际数据集的需要进行调整。)cor.test
进入cor.test()
,这将summary()
的每个唯一值的数据帧减少到一行(具有相关性等)cyl
- 我在
中使用summary()
,它创建列表列list()
- 我使用
对broom::tidy()
cor.test()
- I
list columns以返回没有list columns的普通数据帧unnest()
- 最后一个
只需对列重新排序,以便在下面的输出中显示最相关的列select()
库(“tidyverse”)
mtcars%>%
组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别
总结(n=n(),
drat=列表(对应测试(显示、drat、使用=“配对”),
wt=列表(对应测试(显示,wt,use=“pair”),
qsec=列表(相关测试(disp,qsec,use=“pair”))%>%
在(变量(drat,wt,qsec),~map(.x,~broom::tidy(.x)))处发生突变%>%
unnest(drat、wt、qsec、.sep=“”)%>%
选择(cyl,n,以(“估计”)结束,以(“p.value”)结束,所有内容()
#>#tibble:3 x 26
#>气缸阻力估算重量估算qsec估算阻力p值
#>
#> 1 4 11 -0.500 0.857 0.328 0.117
#> 2 6 7 -0.831 0.473 0.789 0.0205
#> 3 8 14 -0.0922 0.755 0.195 0.754
#> # ... 还有20个变量:wt_p.value,qsec_p.value,
#>#drat_统计,drat_参数,drat_conf.low,
#>#drat_形态高,drat_方法,drat_备选方案,
#>#wt_统计,wt_参数,wt_conf.low,
#>#wt#U形态高,wt#U方法,wt#U备选方案,
#>#qsec_统计,qsec_参数,qsec_conf.low,
#>#qsec_形态高,qsec_方法,qsec_替代方案
前六行也可以写为:
mtcars%>%
添加计数(气缸)%>%
组员(气缸,n)%>%
总结(变量(drat、wt、qsec),~list(相关测试(、disp)))
Wow!非常感谢您的高效详细回答。如果可以的话,我会给你10张赞成票。非常欢迎你。你可以考虑编辑你的问题的标题,使它更一般,对其他人有用。实际上,你所面临的问题并不是特定于相关性的。也许是类似于“我如何组合数据框架,在多个变量和多个组中携带多个统计信息?”的东西,太棒了!你是对的。我相应地更改了标题。再次非常感谢你。
> odf
cyl wt qsec drat
1 4 0.8181818 0.29696970 -0.41337577
2 6 0.7181848 0.92763366 -0.29629630
3 8 0.4453704 0.07734925 -0.05153203