R:如何根据实验组和p值创建一个包含平均值和sd的表格?

R:如何根据实验组和p值创建一个包含平均值和sd的表格?,r,statistics,R,Statistics,我知道如何对单个变量执行所有这些操作,但我需要报告大量变量的信息,并且想知道是否有一种有效的方法来执行这些操作 首先,让我们制作一些示例数据。对于每个样本,我们都有一个唯一的ID、它的实验组和一些我们想要计算平均值和SD的变量 ## Make a data frame called "Data" with five columns Data <- as.data.frame(cbind(1:100, sample(1:2), rnorm(100), rnorm(100), rnorm(10

我知道如何对单个变量执行所有这些操作,但我需要报告大量变量的信息,并且想知道是否有一种有效的方法来执行这些操作

首先,让我们制作一些示例数据。对于每个样本,我们都有一个唯一的ID、它的实验组和一些我们想要计算平均值和SD的变量

## Make a data frame called "Data" with five columns
Data <- as.data.frame(cbind(1:100, sample(1:2), rnorm(100), rnorm(100), rnorm(100), rnorm(100)))
names(Data) <- c("ID", "Group", "V1", "V2", "V3", "V4")

## Now we will take a peak at the top of our data frame
> head(Data)

  ID Group         V1         V2         V3         V4
1  1     2  0.3681539 -0.5008400  1.2060665 -0.7352376
2  2     1 -0.1043180  2.2038190 -1.4367898  2.1961246
3  3     2 -0.2720279 -0.5923554 -1.4628190 -1.8776453
4  4     1 -2.3299662 -0.1216227  0.4200776  1.5504020
5  5     2 -0.3670578 -1.5903221 -0.6287083 -1.0543262
6  6     1  0.4840047 -0.3181554 -1.4596980 -0.4261827
##制作一个名为“data”的数据框,包含五列

数据在Alexander提供的数据对象中:

 aggregate( . ~ Group, FUN=function(x) c(mn=mean(x), sd=sd(x)), data=Data[-1])
# Output
  Group       V1.mn       V1.sd       V2.mn       V2.sd
1     1  0.05336901  0.85468837  0.06833691  0.94459083
2     2 -0.01658412  0.97583110 -0.02940477  1.11880398
       V3.mn      V3.sd       V4.mn       V4.sd
1 -0.2096497  1.1732246  0.08850199  0.98906102
2  0.0674267  0.8848818 -0.11485148  0.90554914
data参数省略ID列,因为您只需要数据列上的结果。收集p值的请求可通过以下方式完成:

 sapply(names(Data)[-(1:2)], function(x) c( 
                   Mean.Grp1 = mean(Data[Data$Group==1,x]), 
                   Mean.Grp2 = mean(Data[Data$Group==2,x]), 
                   `p-value`= t.test(Data[Data$Group==1, x], 
                                     Data[Data$Group==2,x])$p.value )
          )
#---------------------------
                   V1          V2         V3          V4
Mean.Grp1  0.05336901  0.06833691 -0.2096497  0.08850199
Mean.Grp2 -0.01658412 -0.02940477  0.0674267 -0.11485148
p-value    0.70380932  0.63799544  0.1857743  0.28624585

如果您想将SD添加到该输出中,那么策略似乎是显而易见的。您应该注意“p值”名称的反引号。减号在语法上是“活动”的,如果没有括在引号中,则会被解释为函数。

包使除p值之外的所有内容都变得简单,并且p值是可行的。下面是一个简单的例子:

> library(tables)
> iris2 <- iris[ iris$Species != 'versicolor', ]
> iris2$Species <- factor(iris2$Species)
> tmp <- tabular( Petal.Width+Petal.Length + Sepal.Width+Sepal.Length ~ Species* (mean+sd), data=iris2 )
> 
> tmp.p <- sapply( names(iris2)[1:4], function(x) t.test( iris2[[x]] ~ iris2$Species )$p.value )
> 
> tmp

              setosa        virginica       
              mean   sd     mean      sd    
 Petal.Width  0.246  0.1054 2.026     0.2747
 Petal.Length 1.462  0.1737 5.552     0.5519
 Sepal.Width  3.428  0.3791 2.974     0.3225
 Sepal.Length 5.006  0.3525 6.588     0.6359

> tmp2 <- cbind(tmp, tmp.p)
> colnames(tmp2) <- c('Setosa Mean','Setosa SD', 'Virginica Mean','Virginica SD',
+ 'P-value')
> tmp2
             Setosa Mean Setosa SD Virginica Mean Virginica SD P-value     
Sepal.Length 0.246       0.1053856 2.026          0.2746501    3.966867e-25
Sepal.Width  1.462       0.173664  5.552          0.5518947    4.570771e-09
Petal.Length 3.428       0.3790644 2.974          0.3224966    9.269628e-50
Petal.Width  5.006       0.3524897 6.588          0.6358796    2.437136e-48

除非用p值转置表,否则建议的代码不起作用。

在适当的
lm
glm
模型上的
summary
输出是否足够。我要找的是一个函数,它给了我一个这样的表格:Variabe/Mean(SD)代表组1/Mean(SD代表组2/p-值代表组间差异平均值)你能用示例数据和输出来展开你的问题吗?很好!我需要学习如何使用
aggregate()
自己发挥作用。有没有一种简单的方法可以将t-test p值添加到该输出中?如果一个组有更多的级别,例如12级,您将如何扩展此解决方案?另外,dplyr包中的
总结
以什么方式无法满足此问题要求?@jiggunjer:对不起,不明白。有两个答案。第一个答案应该是n在
变量的多个层次上,ot有任何困难。第二个显然不能使用t检验,因为这是针对两个组的。你是在问如何进行卡方检验或F检验吗?我不知道你为什么要问关于
dplyr
包的第二个问题,因为我不认为
dplyr
包存在于2012年。很抱歉,我不知道时间线,忽略dyplr评论。但我指的是第二个示例,即多个t测试,所以第1组对第3组,第1组对第4组,第2组对第3组,等等。我认为这样的多个比较是非常常见的事情,所以我想知道这将如何扩展。有趣的是,我刚刚尝试了你的code,并且它似乎不起作用(使用表0.7.64)。也在我的数据上尝试了它,相同的错误:“cbind中的错误(deparse.level,…):如果表具有不同的行,则无法cbind。”关于如何向tablar类的对象添加列,还有什么进一步的建议吗?@WilliamBligh,我看到了与您相同的事情。显然,tables包已经更新,以进行更多的检查,这破坏了我原来的解决方案(但也保护了我)。我在上面添加了一种不同的方法。谢谢你的catch.Perfect。我昨天差点就搞定了,但出于愚蠢的原因,我将Wilcoxon测试的p.val和W.stats函数放在括号内,用(mean+sd),不知道为什么这些值与apply调用中的值不一样。我很愚蠢,但我认为其他人可以从这个错误中学习。嗯,对于简单的表来说,这很好,但我不知道如何处理更复杂的数据。我在这个问题上打开了一个新线程。
 sapply(names(Data)[-(1:2)], function(x) c( 
                   Mean.Grp1 = mean(Data[Data$Group==1,x]), 
                   Mean.Grp2 = mean(Data[Data$Group==2,x]), 
                   `p-value`= t.test(Data[Data$Group==1, x], 
                                     Data[Data$Group==2,x])$p.value )
          )
#---------------------------
                   V1          V2         V3          V4
Mean.Grp1  0.05336901  0.06833691 -0.2096497  0.08850199
Mean.Grp2 -0.01658412 -0.02940477  0.0674267 -0.11485148
p-value    0.70380932  0.63799544  0.1857743  0.28624585
> library(tables)
> iris2 <- iris[ iris$Species != 'versicolor', ]
> iris2$Species <- factor(iris2$Species)
> tmp <- tabular( Petal.Width+Petal.Length + Sepal.Width+Sepal.Length ~ Species* (mean+sd), data=iris2 )
> 
> tmp.p <- sapply( names(iris2)[1:4], function(x) t.test( iris2[[x]] ~ iris2$Species )$p.value )
> 
> tmp

              setosa        virginica       
              mean   sd     mean      sd    
 Petal.Width  0.246  0.1054 2.026     0.2747
 Petal.Length 1.462  0.1737 5.552     0.5519
 Sepal.Width  3.428  0.3791 2.974     0.3225
 Sepal.Length 5.006  0.3525 6.588     0.6359

> tmp2 <- cbind(tmp, tmp.p)
> colnames(tmp2) <- c('Setosa Mean','Setosa SD', 'Virginica Mean','Virginica SD',
+ 'P-value')
> tmp2
             Setosa Mean Setosa SD Virginica Mean Virginica SD P-value     
Sepal.Length 0.246       0.1053856 2.026          0.2746501    3.966867e-25
Sepal.Width  1.462       0.173664  5.552          0.5518947    4.570771e-09
Petal.Length 3.428       0.3790644 2.974          0.3224966    9.269628e-50
Petal.Width  5.006       0.3524897 6.588          0.6358796    2.437136e-48
library(tables)
iris2 <- iris[ iris$Species != 'versicolor', ]
iris2$Species <- factor(iris2$Species)
P.value <- function(x) t.test(x ~ iris2$Species)$p.value
tmp <- tabular( Petal.Width+Petal.Length + Sepal.Width+Sepal.Length ~ Species* (mean+sd) + P.value, data=iris2 )
tmp