我想使用前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]]。
感谢。
答案 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)