R语言:如何基于另一个DataFrame匹配结果对DataFrame子集化?
问题:根据subtypes聚类结果拆分exp.df数据框
需求
编写循环(或类似逻辑),依据subtypes$clust的分类,对exp.df数据框按列进行子集拆分。
尝试的代码
df.1a <- exp.df[colnames(exp.df) %in% rownames(subtypes),] && subtypes[subtypes$clust=="1a",] df.2a <- exp.df[colnames(exp.df) %in% rownames(subtypes),] && subtypes[subtypes$clust=="2a",] df.1b <- exp.df[colnames(exp.df) %in% rownames(subtypes),] && subtypes[subtypes$clust=="1b",] df.2b <- exp.df[colnames(exp.df) %in% rownames(subtypes),] && subtypes[subtypes$clust=="2b",]
报错信息
Error in exp[colnames(exp.df) %in% rownames(subtypes), ] && subtypes[subtypes$clust == : invalid 'x' type in 'x && y'
数据示例
exp.df
> dput(exp.df[1:5,1:5]) structure(list(TCGA.2K.A9WE.01A = c(7.65342121905285, 6.35598354101006, 14.3511850042327, 10.3737643425674, 10.0819596419255), TCGA.2Z.A9J1.01A = c(5.09389393824392, 6.93597002271109, 12.4136523086721, 11.1918237390263, 10.1912122382252 ), TCGA.2Z.A9J3.01A = c(4.70168212029528, 7.54694769203808, 10.1689338100564, 9.96839262629172, 9.87305770150294), TCGA.2Z.A9J5.01A = c(7.99645936536463, 6.89258167250936, 13.6832285748428, 10.3714563849361, 10.4176870383992 ), TCGA.2Z.A9J6.01A = c(5.13719199914349, 6.92859654071157, 12.0367193976262, 10.8202555636581, 10.3262700402849)), row.names = c("A1BG", "A2LD1", "A2M", "A4GALT", "AAAS"), class = "data.frame")
subtypes
> dput(subtypes[1:5,]) structure(list(clust = c("1a", "2a", "2b", "1b", "2a"), row.names = c("TCGA.2K.A9WE.01A", "TCGA.2Z.A9J1.01A", "TCGA.2Z.A9J3.01A", "TCGA.2Z.A9J5.01A", "TCGA.2Z.A9J6.01A"), class = "data.frame")
期望输出
df.1a
structure(list(TCGA.2K.A9WE.01A = c(7.65342121905285, 6.35598354101006, 14.3511850042327, 10.3737643425674, 10.0819596419255), TCGA.2Z.A9J1.01A = c(5.09389393824392, 6.93597002271109, 12.4136523086721, 11.1918237390263, 10.1912122382252 )), row.names = c("A1BG", "A2LD1", "A2M", "A4GALT", "AAAS"), class = "data.frame")
df.2a
structure(list(TCGA.2Z.A9J3.01A = c(4.70168212029528, 7.54694769203808, 10.1689338100564, 9.96839262629172, 9.87305770150294), TCGA.2Z.A9J6.01A = c(5.13719199914349, 6.92859654071157, 12.0367193976262, 10.8202555636581, 10.3262700402849)), row.names = c("A1BG", "A2LD1", "A2M", "A4GALT", "AAAS"), class = "data.frame")
df.1b
structure(list(TCGA.2Z.A9J5.01A = c(7.99645936536463, 6.89258167250936, 13.6832285748428, 10.3714563849361, 10.4176870383992 )), row.names = c("A1BG", "A2LD1", "A2M", "A4GALT", "AAAS"), class = "data.frame")
df.2b
structure(list(TCGA.2Z.A9J3.01A = c(4.70168212029528, 7.54694769203808, 10.1689338100564, 9.96839262629172, 9.87305770150294)), row.names = c("A1BG", "A2LD1", "A2M", "A4GALT", "AAAS"), class = "data.frame")
解决方案
错误原因
&&是用于单个布尔值判断的逻辑运算符,无法直接拼接两个数据框。正确逻辑是:先根据聚类结果筛选对应列名,再从exp.df中提取这些列。
方法1:循环实现
# 获取所有唯一聚类标签 clust_labels <- unique(subtypes$clust) # 循环拆分并生成对应变量 for (label in clust_labels) { # 筛选当前聚类的样本名 sample_names <- rownames(subtypes[subtypes$clust == label, ]) # 提取对应列并赋值给以df.开头的变量 assign(paste0("df.", label), exp.df[, sample_names, drop = FALSE]) }
方法2:split函数批量拆分(推荐)
若无需生成单独变量,可将结果存入列表,更便于后续操作:
# 按聚类标签拆分样本名,再提取对应列 df_list <- lapply(split(rownames(subtypes), subtypes$clust), function(x) exp.df[, x, drop = FALSE]) # 通过df_list$`1a`、df_list$`2a`访问对应子集 # 若一定要生成单独变量,执行以下代码: list2env(df_list, .GlobalEnv)
结果验证
运行上述代码后,df.1a、df.2a等变量将与期望输出完全一致。
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

