【问题标题】:Conducting a t-test across two different data frames with switched rows/columns?使用切换的行/列对两个不同的数据帧进行 t 检验?
【发布时间】:2018-04-18 20:56:18
【问题描述】:

对不起,这个令人困惑的标题,这个有点难以描述。基本上,我有两个类似这样的数据表:

df1 <- data.frame(SNP=c("W", "X", "Y", "Z"),
                  Gene.ID=c("A", "B", "C", "B"), pval=NA)
df2 <- data.frame(W=c(1, 0, 1), X=c(1, 1, 0), Y=c(0, 0, 1), Z=c(1, 0, 1),
                  A=c(3.5, 2.5, 3.5), C=c(4.5, 2.5, 1.5), B=c(1.5, 2.5, 1.5))

所以 df1 中的所有条目都对应 df2 中的列名。我的目标是用 t 检验的 p 值填充 df1$pval。对于 df1 中的每一行,我想做一个 t 检验,比较匹配 df1$SNP 值的 df2 列,并将其与匹配 df1$Gene.ID 值的 df2 列进行比较。

例如,对于 df1 中的第一行,我想比较 df2$W 与 df2$A,然后在 df1[1, 3] 中返回结果 p 值。对于第二行,我将比较 df2$X 与 df2$B 并返回 df1[2, 3] 中的 p 值。换句话说,是这样的:

for (i in 1:nrow(df1)){
  test <- t.test(df2[,which(colnames(df2)==df1[i, 1]] ~ df2[,which(colnames(df2)==df1[i, 2]])
  df1[i, 3] <- test$p.value
}

但这不起作用,因为您只能使用colnames 函数选择多个列名,而不仅仅是单个列名。非常感谢有关如何解决此问题的建议 - 或者如果您有更简单的方法,那也很棒。

【问题讨论】:

    标签: r subset t-test


    【解决方案1】:

    这里使用which(colnames(df2)...) 可能不是最佳选择,因为您要做的就是选择df2 中以df1[i,1]df1[i,2] 作为名称的列。

    在 R 中,按名称选择列的一种方法是使用双括号:例如df2[["A"]] 将检索df2 的列A,这似乎是您想要的,并且比df2[, which(colnames(df2) == "A")] 更简单。

    考虑到这一点,您可以像这样重写您的代码:

    for (i in 1:nrow(df1)){
      test <- t.test(df2[[df1[i, 2]]] ~ df2[[df1[i, 1]]])
      df1[i, 3] <- test$p.value
    } 
    

    请注意,我切换了df1[i, 1]df1[i, 2],因为t.test 的文档指出二进制变量必须位于右侧。

    lhs ~ rhs 形式的公式,其中 lhs 是一个数值变量,给出数据值,rhs 是一个因子,具有两个级别,给出相应的组

    【讨论】:

    • 这个双括号技巧真的很方便!我没有意识到没有 $ 运算符你可以做到这一点。感谢您的提示!
    • 是的,我是$ 的忠实粉丝,它使用起来更简单,但[[...]] 提供的更多。
    【解决方案2】:

    我不明白你为什么认为这行不通——我认为你的代码只是有语法错误。以下代码似乎可以正常工作(注意使用 sapply 的更改,这在 R 中更为传统):

    df1[, 3] <- sapply(seq_len(nrow(df1)), 
      function(i) {
        test <- t.test(
          df2[, which(colnames(df2) == df1[i, 1])],
          df2[, which(colnames(df2) == df1[i, 2])])
        test$p.value
      })
    

    【讨论】:

    • 也许我只是做错了什么,但我似乎无法让 colnames 仅用于单个列。例如,如果我输入 colnames(df[,1]),则输出为 NULL,而 colnames(df[,1:2] 返回 SNP 和 Gene.ID。
    • 查看df[, 1]df[, 1:2]df[, 1, drop=FALSE] 的输出,并查看以下部分(8.1.44 和45):burns-stat.com/pages/Tutor/R_inferno.pdf#page=68
    • 顺便说一句,我并不是说听起来很短——这是一个常见的错误,实际上你只是期待 R 的逻辑和一致的行为——我相信你会随着时间的推移停止这样做:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 2018-09-03
    相关资源
    最近更新 更多