首页 > 解决方案 > 根据不同列的不同条件过滤结果

问题描述

当满足以下条件时,我想找到平均得分最低的人:

  1. 超过 2 条总评论
  2. 超过 3 个项目已审核
人们 分数 物品
玛丽 1.0 一个
玛丽 2.0 一个
杰克 1.5 b
杰克 3.0 一个
杰克 4.1 b
凯特 0.8 一个

我写了这样的代码

df %>%
  group_by(people) %>%
  mutate(na = n()) %>%
  filter(na > 2)

df %>%
  group_by(item) %>%
  mutate(nb = n()) %>%
  filter(nb > 60)

df %>%
group_by(people) %>%
mutate(meanscore = mean(score))

我不知道如何合并/混合结果。另外,我想我没有写下来。

标签: rfilterdplyr

解决方案


使用这个假数据集df

   People score item
1    Mary   1.0    a
2    Kate   4.0    c
3    Jack   1.5    b
4    Jack   3.0    a
5    Jack   4.1    b
6    Kate   0.8    b
7    Mary   1.0    c
8    Mary   1.0    b
9    Jack   1.5    c
10   Mary   3.0    d
11   Jack   4.1    b
12   Kate   0.8    a
df <- structure(list(People = c("Mary", "Kate", "Jack", "Jack", "Jack", 
"Kate", "Mary", "Mary", "Jack", "Mary", "Jack", "Kate"), score = c(1, 
4, 1.5, 3, 4.1, 0.8, 1, 1, 1.5, 3, 4.1, 0.8), item = c("a", "c", 
"b", "a", "b", "b", "c", "b", "c", "d", "b", "a")), class = "data.frame", row.names = c(NA, 
-12L))

你可以这样做:

library(dplyr)
df %>% 
    group_by(People) %>% 
    summarise(avg_score = mean(score), 
              Total_Review = n(), 
              distinct_items = n_distinct(item)) %>% 
    filter(avg_score==min(avg_score) & 
               Total_Review > 2 & 
               distinct_items > 3)

你得到:

People avg_score Total_Review distinct_items
  <chr>      <dbl>        <int>          <int>
1 Mary         1.5            4              4

假设和解释:

  1. Total_Reviewn()之后group_by(People)
  2. 项目是不同的:因此 a,b,a = 2 或 a,b,a,a,b,c = 3

如果这些假设是正确的: 我们可以应用summarise函数:meann然后n_distinct 我们可以应用filter逻辑。


推荐阅读