我有一个数据帧,看起来像这样:
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#开头的相应列。我已经通过为每一对列键入以下内容来手动完成此操作。
t.test(df$A1U_sweet, df$C1U_sweet)有没有办法让我在A1U和C1U、A2U和C2U以及A3U和C3U上运行t.tests?我尝试使用apply函数和for循环,但无法弄清楚如何在这种情况下使它们工作。
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")发布于 2018-02-11 07:34:37
如果我们需要对“A”和“C”的相应“1s”、“2s”和“3s”执行t.test,则根据仅包含数字的列名的子字符串对数据集执行split操作,然后应用t.test
lapply(split.default(df[2:7], gsub("\\D+", "", names(df)[2:7])), t.test)发布于 2018-02-11 08:17:56
任务本身并不困难或复杂,尽管由于数据的排列方式,它看起来是这样的。当您看到变量名传递了多条信息时,问问自己是否可以用更简单的方式排列数据通常是很有帮助的。这个简单的声明是R中流行的“整洁”数据操作方法的核心,虽然我并不喜欢以“整洁”的名义所做的一切,但这个核心声明是合理的,您违反了它(就像您在这里所做的那样),只是冒着使您的分析比需要的困难得多的风险。
一个不错的第一步是重新排列数据,这样数据就不会编码在列名中:
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这可能看起来像是大量的工作,但它使数据更容易处理,而且不仅仅是对于这个特定的操作。
现在已经将数据转换为合理的排列,实际任务非常简单:
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 https://stackoverflow.com/questions/48726481
复制相似问题