You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 20:46:35