首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行多个t.tests以比较R中的列值对

运行多个t.tests以比较R中的列值对
EN

Stack Overflow用户
提问于 2018-02-11 06:59:12
回答 2查看 1.5K关注 0票数 1

我有一个数据帧,看起来像这样:

代码语言:javascript
复制
Age  A1U_sweet  A2F_dip  A3U_bbq  C1U_sweet  C2F_dip  C3U_bbq  Comments
23   1          2        1        NA         NA       NA       Good
54   NA         NA       NA       4          1        2        ABCD
43   2          4        7        NA         NA       NA       HiHi

我尝试运行一系列t.tests来比较以A#开头的列和以C#开头的相应列。我已经通过为每一对列键入以下内容来手动完成此操作。

代码语言:javascript
复制
t.test(df$A1U_sweet, df$C1U_sweet)

有没有办法让我在A1U和C1U、A2U和C2U以及A3U和C3U上运行t.tests?我尝试使用apply函数和for循环,但无法弄清楚如何在这种情况下使它们工作。

代码语言:javascript
复制
df <- read.table(header = TRUE, stringsAsFactors = FALSE, text = "
                 Age  A1U_sweet  A2F_dip  A3U_bbq  C1U_sweet  C2F_dip  C3U_bbq  Comments
                  23   1          2        1              2         5       5       Good
                  54   1          3        1              4         1       2       ABCD
                  43   2          4        7              1         1       1       HiHi")
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-11 07:34:37

如果我们需要对“A”和“C”的相应“1s”、“2s”和“3s”执行t.test,则根据仅包含数字的列名的子字符串对数据集执行split操作,然后应用t.test

代码语言:javascript
复制
lapply(split.default(df[2:7], gsub("\\D+", "", names(df)[2:7])), t.test)
票数 1
EN

Stack Overflow用户

发布于 2018-02-11 08:17:56

任务本身并不困难或复杂,尽管由于数据的排列方式,它看起来是这样的。当您看到变量名传递了多条信息时,问问自己是否可以用更简单的方式排列数据通常是很有帮助的。这个简单的声明是R中流行的“整洁”数据操作方法的核心,虽然我并不喜欢以“整洁”的名义所做的一切,但这个核心声明是合理的,您违反了它(就像您在这里所做的那样),只是冒着使您的分析比需要的困难得多的风险。

一个不错的第一步是重新排列数据,这样数据就不会编码在列名中:

代码语言:javascript
复制
df <- read.table(header = TRUE, stringsAsFactors = FALSE, text = "
                 Age  A1U_sweet  A2F_dip  A3U_bbq  C1U_sweet  C2F_dip  C3U_bbq  Comments
                  23   1          2        1        2         5       5       Good
                  54   1         3       1       4          1        2        ABCD
                  43   2          4        7        1         1       1       HiHi")

library(tidyr)

df <- data.frame(id = 1:nrow(df), df)

dfl <- gather(df, key = "key", value = "value", -id, -Age, -Comments)
dfl <- separate(dfl, key, into = c("key", "kind", "type"), sep = c(1, 4))
dfl
##    id Age Comments key kind  type value
## 1   1  23     Good   A  1U_ sweet     1
## 2   2  54     ABCD   A  1U_ sweet     1
## 3   3  43     HiHi   A  1U_ sweet     2
## 4   1  23     Good   A  2F_   dip     2
## 5   2  54     ABCD   A  2F_   dip     3
## 6   3  43     HiHi   A  2F_   dip     4
## 7   1  23     Good   A  3U_   bbq     1
## 8   2  54     ABCD   A  3U_   bbq     1
## 9   3  43     HiHi   A  3U_   bbq     7
## 10  1  23     Good   C  1U_ sweet     2
## 11  2  54     ABCD   C  1U_ sweet     4
## 12  3  43     HiHi   C  1U_ sweet     1
## 13  1  23     Good   C  2F_   dip     5
## 14  2  54     ABCD   C  2F_   dip     1
## 15  3  43     HiHi   C  2F_   dip     1
## 16  1  23     Good   C  3U_   bbq     5
## 17  2  54     ABCD   C  3U_   bbq     2
## 18  3  43     HiHi   C  3U_   bbq     1

这可能看起来像是大量的工作,但它使数据更容易处理,而且不仅仅是对于这个特定的操作。

现在已经将数据转换为合理的排列,实际任务非常简单:

代码语言:javascript
复制
lapply(split(dfl, dfl$type), function(d) t.test(value ~ key, data = d))
## $bbq
## 
##  Welch Two Sample t-test
##  
## data:  value by key
## t = 0.14286, df = 3.2778, p-value = 0.8947
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -6.748715  7.415381
## sample estimates:
## mean in group A mean in group C 
##        3.000000        2.666667 
##
##
## $dip
## 
##  Welch Two Sample t-test
## 
## data:  value by key
## t = 0.45883, df = 2.7245, p-value = 0.6805
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -4.233396  5.566729
## sample estimates:
## mean in group A mean in group C 
##        3.000000        2.333333 
## 
## 
## $sweet
## 
##  Welch Two Sample t-test
## 
## data:  value by key
## t = -1.0607, df = 2.56, p-value = 0.3785
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -4.31437  2.31437
## sample estimates:
## mean in group A mean in group C 
##        1.333333        2.333333 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48726481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档