在R中如何提取数据框两列表列的公共元素并生成新列
R语言实现数据框逐行求两列表列的交集
问题原因
你编写的代码未生效是因为intersect()函数默认对两个输入的完整集合整体计算交集,而非按行对应计算,因此得到的是整列dir_list_2和整列dir_list所有元素的公共值,不符合逐行计算的需求。
实现方法
方法1:基础R实现(无需加载额外包)
使用mapply函数逐元素遍历两个列表列,逐行调用intersect:
# 计算结果为列表列,每个元素存储对应行的交集向量 data$common_dir <- mapply(intersect, data$dir_list_2, data$dir_list, SIMPLIFY = FALSE) # 如果需要将交集转为逗号分隔的字符串存储,可改为: data$common_dir <- sapply(mapply(intersect, data$dir_list_2, data$dir_list, SIMPLIFY = FALSE), paste, collapse = ",")
方法2:tidyverse风格实现
使用dplyr的rowwise()语法实现逐行运算:
library(dplyr) data <- data %>% rowwise() %>% # 用list包裹结果,生成列表列存储交集向量 mutate(common_dir = list(intersect(dir_list_2, dir_list))) %>% ungroup() # 如需存储为字符串格式,可调整mutate语句: # mutate(common_dir = paste(intersect(dir_list_2, dir_list), collapse = ","))
效果验证
我们可以用测试数据验证效果:
# 构造测试数据 test_data <- data.frame(id = 1:2) test_data$dir_list_2 <- list(c(1,2,3,4), c(6,7,8)) test_data$dir_list <- list(c(3,4,5), c(7,9,10)) # 执行逐行交集计算 test_data$common_dir <- mapply(intersect, test_data$dir_list_2, test_data$dir_list, SIMPLIFY = FALSE)
计算完成后,第一行common_dir值为3,4,第二行值为7,符合需求。
内容的提问来源于stack exchange,提问作者SONAKSHI AGRAWAL
相关产品推荐
相关产品推荐

