r - 查找特定列的 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 不同的变量列表。例如:
解决方案
一个选项是按“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
推荐阅读
- java - 使用多个 jms 侦听器处理多个队列的可能性
- reactjs - 为什么我不能在导航栏按钮和关闭按钮之间切换?
- c++ - 如何以更通用的方式转换 unique_ptr 的向量
- javascript - redux reducer 哪个更快:switch 还是 map?
- url-parameters - 如何根据 URL 参数计算公式
- python - 有没有办法从绘图中提取当前帧?
- php - 通过给定的经度和纬度查找在数据库中注册的位置 - Laravel
- wicket-1.6 - 使用 Apache Wicket 设置反馈组件
- php - php foreach 循环中的 HTML 表格,其中仅当元素等于表格列标题名称时才会填充单元格数据
- react-native - React Native - 运行并行 Axios / 获取请求