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

时间:2018-02-10 22:59:12

标签: r

我有一个如下所示的数据框:

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")

2 个答案:

答案 0 :(得分:1)

如果我们需要在相应的&#39; 1&#39;,&#39; 2s&#39;上执行t.test和&#39; 3s&#39;为了&#39; A&#39;和&#39; C&#39;,然后split数据集基于列名称的子字符串,仅包含数字,然后应用t.test

lapply(split.default(df[2:7], gsub("\\D+", "", names(df)[2:7])), t.test)

答案 1 :(得分:1)

任务本身并不困难或复杂,但由于数据的排列方式,它似乎是这样。当您看到传达多个信息的变量名称时,自问是否可以更简单地排列数据通常会很有帮助。这个简单的主张是R中流行的“整洁”数据操作方法的核心。虽然我不是那些以“整洁”的名义所做的一切的粉丝,但这个核心主张是健全的,而你违反它(正如你在这里所做的那样)只会冒你的分析比你需要的更困难的风险。

好的第一步是重新排列数据,以便数据不会以列名编码:

  
<li class="dropdown" id="modus">
  <a href="#">Modus</a>
  <div class="dropdown-content">
    <a href="#" class="mode radio" >ExRaid</a>
    <a href="#" class="mode radio" >Trigger</a>
  </div>
</li>

这可能看起来很多工作,但它使数据更容易使用,而且不仅仅适用于此特定操作。

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

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