按列将数据框拆分为多个数据框

Split dataframe into many dataframes by columns

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

My_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]]))))

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

谢谢。

Subset 可能正在您的数据框中寻找一个名为 SNP 的变量。与其使用子集,不如像下面这样对数据框进行检查。我们 return My_df,但使用 SNP[x] 的那些不 NA 的值来索引我们 return 在 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]]) 是 return 对那些在 SNP[x] 列中不是 NA 的 TRUE 和 FALSE 的位。假设我们说 result = !is.na(My_df[,SNP[x]]),那么我们只是使用 data = My_df[result,],这就给了我们想要的数据行。

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

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)