R语言 从dataframe列表中基于Patient_ID提取元数据并保留原名称
问题诊断
你原来的代码存在以下核心错误:
- for循环版本:
- 变量名拼写错误:赋值时把
lists_of_metadata少写了末尾的a,写成了lists_of_metadat - 初始化类型错误:你要存储多个独立数据框,应该初始化列表而不是数据框
- 列表赋值符号错误:取列表元素赋值应该用双中括号
[[i]],单中括号[i]是取列表的子列表,和数据框赋值逻辑不匹配
- 变量名拼写错误:赋值时把
- lapply版本:
- 匹配值逻辑错误:
names(x)[ grep("Patient_ID", names(x))]拿到的是列名字符串"Patient_ID",不是该列存储的患者ID值,自然匹配不到任何元数据
- 匹配值逻辑错误:
正确实现
方案1:lapply(更简洁,自动保留原列表名称)
lists_of_metadata <- lapply(all_lists, function(x) { all_metadata2[all_metadata2$Patient_ID %in% x$Patient_ID, ] })
lapply处理命名列表时会自动继承原列表的名称,所以最终得到的lists_of_metadata会完全保留all_lists里各个数据框的原有名称。
方案2:for循环版本
# 初始化和all_lists长度相同的列表 lists_of_metadata <- vector("list", length = length(all_lists)) # 继承原列表的名称 names(lists_of_metadata) <- names(all_lists) for (i in seq_along(all_lists)) { lists_of_metadata[[i]] <- all_metadata2[all_metadata2$Patient_ID %in% all_lists[[i]]$Patient_ID, ] }
补充说明
如果要把所有匹配到的元数据合并为一个总数据框,同时保留来源分组,可以参考以下写法:
lists_of_metadata <- lapply(names(all_lists), function(group_name) { meta <- all_metadata2[all_metadata2$Patient_ID %in% all_lists[[group_name]]$Patient_ID, ] meta$source_group <- group_name return(meta) }) # 合并为总表 total_metadata <- do.call(rbind, lists_of_metadata)
内容的提问来源于stack exchange,提问作者Macdonald
相关产品推荐
相关产品推荐

