R语言:如何提取DataFrame中任意两列重复数值生成新表
解决R语言提取多列间重复数值的问题
嘿,我来帮你搞定这个需求!你要的是从三列里找出任意两列都出现过的数值,整理成新的DataFrame对吧?我给你分步骤写清楚,还附示例代码,你可以直接套到自己的数据上。
第一步:先构造示例数据(方便你理解)
假设你的原始数据长这样:
# 模拟你的DataFrame df <- data.frame( year1 = c(1, 2, 3, 4, 5), year2 = c(3, 4, 6, 7, 8), year3 = c(5, 6, 9, 10, 4) )
第二步:计算每两组列的交集,整理成带标注的DataFrame
如果需要知道每个重复数值具体出现在哪两列,咱们可以给每个交集加上列对标签,再合并起来:
# 加载dplyr包(没装的话先跑 install.packages("dplyr")) library(dplyr) # 分别计算三对列的交集,并添加上对应的列对名称 year1_year2 <- tibble(value = intersect(df$year1, df$year2), pair = "year1 & year2") year2_year3 <- tibble(value = intersect(df$year2, df$year3), pair = "year2 & year3") year1_year3 <- tibble(value = intersect(df$year1, df$year3), pair = "year1 & year3") # 把三个结果合并成最终的DataFrame result_df <- bind_rows(year1_year2, year2_year3, year1_year3) # 查看结果 print(result_df)
运行后你会得到这样的结果:
# A tibble: 6 × 2 value pair <dbl> <chr> 1 3 year1 & year2 2 4 year1 & year2 3 6 year2 & year3 4 4 year2 & year3 5 5 year1 & year3 6 4 year1 & year3
第三步:如果需要去重(同一个值只保留一次)
要是你不想看到重复的数值(比如上面的4出现在三对列里,只留一条记录),可以用distinct去重:
result_df_distinct <- result_df %>% distinct(value, .keep_all = TRUE) print(result_df_distinct)
结果会变成:
# A tibble: 4 × 2 value pair <dbl> <chr> 1 3 year1 & year2 2 4 year1 & year2 3 6 year2 & year3 4 5 year1 & year3
极简版:只需要去重后的数值列表
如果不需要标注列对,只想要所有在任意两列重复的数值,直接这样写:
# 收集所有两两交集的数值,再去重 unique_duplicates <- unique(c( intersect(df$year1, df$year2), intersect(df$year2, df$year3), intersect(df$year1, df$year3) )) # 转成DataFrame result_simple <- data.frame(value = unique_duplicates) print(result_simple)
输出:
value 1 3 2 4 3 6 4 5
说说你之前合并失败的可能原因
你之前合并没成功,大概率是这两个问题:
- 合并前的子DataFrame列名不统一,导致
rbind报错; - 没有正确用
intersect提取交集,而是直接合并了原始列的数据,结果不对。
试试上面的代码,应该能完美解决你的需求~
内容的提问来源于stack exchange,提问作者user44212
相关产品推荐
相关产品推荐

