如何在R语言中筛选model、country、year相同但factor不同的数据行?
筛选DataFrame中model、country、year相同但factor不同的行
我们需要从给定的R语言DataFrame中,筛选出model、country、year取值完全一致,但factor取值不同的数据行。
原始数据与代码
model <- c("A","B","C","A","A","C","B","A") country <- c("Italy","Germany","Norway","Italy","France","Germany","Norway","Italy") year <- c(2016,2016,2016,2016,2015,2015,2015,2015) value <- c(14,24,11,34,73,11,33,22) factor <- c("NEW","OLD","OLD","OLD","OLD","OLD","NEW","NEW") df <- data.frame(model,country,year,value, factor)
生成的原始DataFrame:
model country year value factor 1 A Italy 2016 14 NEW 2 B Germany 2016 24 OLD 3 C Norway 2016 11 OLD 4 A Italy 2016 34 OLD 5 A France 2015 73 OLD 6 C Germany 2015 11 OLD 7 B Norway 2015 33 NEW 8 A Italy 2015 22 NEW
解决方案
方法1:使用dplyr包
通过分组后筛选出组内factor存在多种取值的行:
library(dplyr) result <- df %>% group_by(model, country, year) %>% filter(n_distinct(factor) > 1) %>% ungroup() print(result)
方法2:Base R实现
通过构造分组键,统计每组的factor唯一值数量,再筛选目标组:
# 构造分组键 group_key <- with(df, paste(model, country, year, sep = "_")) # 统计每组factor的唯一值数量 factor_unique_counts <- tapply(df$factor, group_key, function(x) length(unique(x))) # 筛选出factor有多种取值的组 target_groups <- names(factor_unique_counts[factor_unique_counts > 1]) # 提取目标行 result <- df[group_key %in% target_groups, ] print(result)
输出结果
model country year value factor 1 A Italy 2016 14 NEW 4 A Italy 2016 34 OLD
注:你提供的期望输出中value为22的行(原始数据第8行)对应的year是2015年,与另一行的2016年不一致,不符合筛选条件,正确符合要求的结果如上。
内容的提问来源于stack exchange,提问作者user18937485
相关产品推荐
相关产品推荐

