按列将数据框拆分为多个数据框
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
列)。
您可以通过查看 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)
我想在数据帧上使用前 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
列)。
您可以通过查看 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)