【问题标题】:Split dataframe into many dataframes by columns按列将数据框拆分为多个数据框
【发布时间】:2018-01-31 23:42:08
【问题描述】:

我想使用前 3 列中的变量对数据框执行 lm,但不包括另一列中有 NA 的行(比如第 5 列)。 (我稍后需要这个来做方差分析)。我需要反复执行 lm ,每次都排除在不同列中包含 NA 的不同行集(例如第 6、7、8 列 ...)。真正的数据框有 100,000 列 x 200,000 行,需要 lm 运行约 100000 次。 假设我想运行 lm(pheno~Chip+Sex+Height, data=My_df) 但排除 rs533317162_T.x 列中有 NA 的行?然后我想做同样的事情,但排除下一列(rs550410894_C.x)中有 NA 的行。

我的_df:

Sex Height Age  pheno rs533317162_T.x rs550410894_C.x rs563620164_C.x rs10465242_G.x
2  161.0  50 -0.557               0               0               0              0
2  170.0  69  1.757               0               0               0              0
2  166.0  52  1.262              NA               0               0              0
1  171.0  68  0.144               0               0               0              0
1  178.0  66  0.034               0               0               0              0
2  156.0  54  0.098              NA               0               0              0
2  157.0  61  1.706               0               0               0              0
1  182.0  62 -0.651               1               0               1              1
2  162.0  57 -0.920               0               0               0              0
2  163.0  51  2.237               0               0               0              0
2  165.0  48 -0.294               0               0               0              0
2  167.0  42 -0.911               1               0               0              0
1  180.0  64 -0.717              NA               0               1              1

列列表:

SNP <- c("rs533317162_T.x", "rs550410894_C.x", "rs563620164_C.x", "rs10465242_G.x")

lm函数:

My_lms <- lapply(1:4, function(x)
lm(pheno~Sex+Height+Age, data = subset(My_df, !is.na(SNP[[x]]))))

这将返回四个 lm 中每一个的所有行。 SNP 列中带有 NA 的行仍然在 lm 中使用。如果我手动输入列名而不是 SNP [[x]],它会起作用并排除带有 NA 的行。我也尝试过在 lm 公式中使用权重的类似方法,但没有成功。我认为问题在于 SNP[[x]] 没有被使用或读取。

谢谢。

【问题讨论】:

    标签: r lm


    【解决方案1】:

    说实话,我无法重现您的问题。如果我这样做了

    fit <- lapply(5:8, function(x)
        lm(pheno ~ Sex + Height + Age, data = subset(df, !is.na(df[x]))));
    

    那么lm 仅使用来自df 的那些行,其中相关列中没有NA(此处为5-8 列)。

    您可以通过查看subsetted df 的行数来确认这一点:

    dms <- sapply(5:8, function(x)
            nrow(subset(df, !is.na(df[x]))));
    dms;
    #[1] 10 13 13 13
    

    样本数据

    df <- read.table(text =
        "Sex Height Age  pheno rs533317162_T.x rs550410894_C.x rs563620164_C.x rs10465242_G.x
    2  161.0  50 -0.557               0               0               0              0
    2  170.0  69  1.757               0               0               0              0
    2  166.0  52  1.262              NA               0               0              0
    1  171.0  68  0.144               0               0               0              0
    1  178.0  66  0.034               0               0               0              0
    2  156.0  54  0.098              NA               0               0              0
    2  157.0  61  1.706               0               0               0              0
    1  182.0  62 -0.651               1               0               1              1
    2  162.0  57 -0.920               0               0               0              0
    2  163.0  51  2.237               0               0               0              0
    2  165.0  48 -0.294               0               0               0              0
    2  167.0  42 -0.911               1               0               0              0
    1  180.0  64 -0.717              NA               0               1              1", header = T)
    

    【讨论】:

    • 太好了,很高兴我能帮助@stuartkim。您可以通过接受答案并设置勾选标记来结束问题。
    【解决方案2】:

    Subset 可能正在您的数据框中寻找一个名为 SNP 的变量。而不是使用子集,只需对数据框进行检查,如下所示。我们返回 My_df,但使用那些不是 NA 的 SNP[x] 值来索引我们在 My_df 中返回的行。

    My_lm <- lapply(1:4, function(x){
                               lm(pheno~Sex+Height+Age, data = My_df[!is.na(My_df[,SNP[x]]),]
                               }
    

    为了进一步细分,!is.na(My_df[,SNP[x]]) 是为SNP[x] 列中非 NA 的那些返回 TRUE 和 FALSE 的位。假设我们说的是result = !is.na(My_df[,SNP[x]]),那么我们只是使用data = My_df[result,],这会给出我们想要的数据行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多