首页 > 解决方案 > 查找特定列的 ID 不同的行

问题描述

假设我们有以下数据框:

ID <- c(1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5)
age <- c(25, 25, 25, 22, 22, 56, 56, 56, 80, 33, 33, 90, 90, 90)
gender <- c("m", "m", "m", "f", "f", "m", "m", "m", "m", "m", "m", "f", "f", "m")
company <- c("c1", "c2", "c2", "c3", "c3", "c1", "c1", "c1", "c1", "c5", "c5", "c3", "c4", "c5")
income <- c(1000, 1000, 1000, 500, 1700, 200, 200, 250, 500, 700, 700, 300, 350, 300)

df <- data.frame(ID, age, gender, company, income)

我需要根据年龄、性别和收入的 ID 找到具有不同值的行。我不在乎这家公司是相同的还是不同的。

所以处理后,输出如下:

在此处输入图像描述

奖金,

我们可以创建另一个数据框,其中包含 id 不同的变量列表。例如:

在此处输入图像描述

标签: r

解决方案


一个选项是按“ID”分组,检查“年龄”、“性别”、“收入”中不同元素的数量是否等于 1,然后取反(!

library(dplyr)
out <- df %>%  
         group_by(ID) %>%
         filter(!(n_distinct(age) == 1 &
             n_distinct(gender) == 1 & 
             n_distinct(income) == 1))
out
# A tibble: 9 x 5
# Groups:   ID [3]
#     ID   age gender company income
#  <dbl> <dbl> <fct>  <fct>    <dbl>
#1     2    22 f      c3         500
#2     2    22 f      c3        1700
#3     3    56 m      c1         200
#4     3    56 m      c1         200
#5     3    56 m      c1         250
#6     3    80 m      c1         500
#7     5    90 f      c3         300
#8     5    90 f      c4         350
#9     5    90 m      c5         300

如果有很多变量,另一个选项 ifilter_at

df %>%
    group_by(ID) %>%
    filter_at(vars(age, gender, income), any_vars(!(n_distinct(.) == 1)))

从上面,我们可以得到 ssecond 输出

library(tidyr)
out %>% 
    select(-company) %>%
    gather(key, val, - ID) %>% 
    group_by(key, add = TRUE) %>% 
    filter(n_distinct(val) > 1) %>% 
    group_by(ID) %>% 
    summarise(Different = toString(unique(key)))
# A tibble: 3 x 2
#     ID Different  
#  <dbl> <chr>      
#1     2 income     
#2     3 age, income
#3     5 gender, income     

推荐阅读