在R中匹配dataframe列表的X/Y坐标并提取至新dataframe
R语言实现坐标匹配与物种组合生成
先把分散的数据框整合为列表
别逐个单独处理cell_type_1、cell_type_2这类变量,把它们放进列表里,批量操作更高效:
# 按实际数据框数量调整,比如你有5个就写5个 cell_dfs <- list(cell_type_1, cell_type_2, cell_type_3) # 给列表元素命名,后续组合名更清晰 names(cell_dfs) <- paste0("cell_type_", seq_along(cell_dfs))
提取所有数据框共有的(X,Y)坐标
先找出所有数据框都存在的坐标对,作为匹配基准:
# 提取每个数据框的坐标列 coord_list <- lapply(cell_dfs, function(df) df[, c("X", "Y")]) # 用Reduce逐步合并,找出交集 shared_coords <- Reduce(function(a, b) merge(a, b, by = c("X", "Y")), coord_list)
生成所有物种组合的匹配数据框
要得到所有可能的物种组合(单种、两种、三种...),可以用组合函数生成所有子集,再逐个处理:
library(purrr) library(dplyr) # 生成所有非空子集的索引 all_subsets <- map(1:length(cell_dfs), function(k) combn(seq_along(cell_dfs), k, simplify = FALSE)) %>% flatten() # 遍历每个子集,生成对应的数据框 combo_results <- map(all_subsets, function(idx) { # 取出当前子集的所有数据框 selected <- cell_dfs[idx] # 逐个合并,匹配坐标并拼接Name merged <- Reduce(function(df1, df2) { merge(df1, df2, by = c("X", "Y")) %>% mutate(Name = paste(Name.x, Name.y, sep = "+")) %>% select(X, Y, Name, ID = ID.x) # 这里ID取第一个数据框的,按需调整 }, selected) # 给结果加组合名标识 combo_name <- paste(names(selected), collapse = "+") attr(merged, "combination") <- combo_name merged }) # 给结果列表命名,方便直接调用 names(combo_results) <- map_chr(all_subsets, function(idx) paste(names(cell_dfs)[idx], collapse = "+"))
使用结果
现在combo_results里就是所有组合的数据框,比如调用两种细胞的组合:
# 查看cell_type_1和cell_type_2的匹配结果 combo_results[["cell_type_1+cell_type_2"]]
注意事项
- 如果ID列在不同数据框中无意义,可以直接去掉
ID = ID.x这部分 - 要是需要保留每个物种的原始名称列,不要拼接,就删掉
mutate(Name = ...),保留Name.x、Name.y等列 - 大数据量下推荐用
data.table替代dplyr,合并速度会快很多
内容的提问来源于stack exchange,提问作者Alejandro Rivera
相关产品推荐
相关产品推荐

