Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何组合数据帧,其中包含跨多个变量和多个组的多个统计信息?_R_Correlation_P Value_Tidyverse - Fatal编程技术网

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

我使用以下代码从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 (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
    组上“循环”,而不是显式的
    循环
  • 我使用
    cor.test
    ,它一步给出相关性和p值。(注意,我没有使用斯皮尔曼相关性,因为mtcars数据集中存在联系。您可以根据实际数据集的需要进行调整。)
  • cor.test()
    进入
    summary()
    ,这将
    cyl
    的每个唯一值的数据帧减少到一行(具有相关性等)
  • 我在
    summary()
    中使用
    list()
    ,它创建列表列
  • 我使用
    broom::tidy()
    cor.test()
  • I
    unnest()
    list columns以返回没有list columns的普通数据帧
  • 最后一个
    select()
    只需对列重新排序,以便在下面的输出中显示最相关的列
如果您不熟悉这些工具,但对这些工具感兴趣,我建议您特别阅读R for Data Science一书

库(“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