【问题标题】:group_by filter to groups that share at least one matching valuegroup_by 过滤到至少共享一个匹配值的组
【发布时间】:2019-06-21 18:18:33
【问题描述】:

过滤掉数据框中不共享指定列的至少一个值的分组观察。

我想只保留至少有两个观察年龄相同的组。

df<-data.frame(list(id = c(1,2,3,4,5,6),
                household = c(1, 1, 1, 2, 2, 2), 
                age= c(19, 19, 45, 2,15,50))`

所以最终的 data.frame 应该只包含家庭 == 1, 应该看起来像:

身份证家庭年龄
1 1 19
2 1 19
3 1 45

【问题讨论】:

  • 是的,我使用的是 dplyr。非常感谢!

标签: r filter group-by dplyr


【解决方案1】:

我们可以查看每个组的age 的长度,并将其与unique(age) 的长度进行比较。如果length(age) &gt; length(unique(age)) 至少有两个观测值相同。

library(dplyr)

df %>%
  group_by(household) %>%
  filter(length(age) > length(unique(age)))

#      id household   age
#   <dbl>     <dbl> <dbl>
# 1     1         1    19
# 2     2         1    19
# 3     3         1    45

@Dave2e 指出了另一种dplyr-y 的方法:

df %>%
  group_by(household) %>%
  filter(n() > n_distinct(age))

【讨论】:

  • 如果你想留在 dplyr 世界,那么:filter(n() &gt; n_distinct(age)) 是一个选择
【解决方案2】:

试试这个:

library(dplyr)
df <- data.frame(list(id = c(1,2,3,4,5,6),
                    household = c(1, 1, 1, 2, 2, 2), 
                    age= c(19, 19, 45, 2,15,50)))
df %>%
  filter(household == 1)

【讨论】:

  • OP 的目标是 “我想只保留至少有两个观察值相同的组。” 碰巧household = 1 是解决方案他们的样本数据。
猜你喜欢
  • 2019-11-09
  • 1970-01-01
  • 2021-01-21
  • 2019-03-11
  • 1970-01-01
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多