按列

时间:2018-01-31 23:42:08

标签: r lm

我想使用前3列中的变量对数据帧执行lm,但排除另一列中有NA的行(比如第5列)。 (我以后需要这个做anova)。我需要反复做,每次在不同的列中排除包含NA的不同行集(例如,列6,7,8 ......)。实际数据帧有100,000列×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]]))))

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

感谢。

2 个答案:

答案 0 :(得分:0)

子集可能正在寻找数据帧中名为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,],然后我们只给出了我们想要的数据行。

答案 1 :(得分:0)

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

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

然后lm仅使用df中相关列中没有NA的行(此处为5-8列)。

您可以通过查看subset ted 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)