r - 根据不同列的不同条件过滤结果
问题描述
当满足以下条件时,我想找到平均得分最低的人:
- 超过 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))
我不知道如何合并/混合结果。另外,我想我没有写下来。
解决方案
使用这个假数据集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
假设和解释:
Total_Review
在n()
之后group_by(People)
- 项目是不同的:因此 a,b,a = 2 或 a,b,a,a,b,c = 3
如果这些假设是正确的: 我们可以应用summarise
函数:mean
,n
然后n_distinct
我们可以应用filter
逻辑。
推荐阅读
- python - Python Pandas 中 DataFrame 中的数据操作?
- php - 如何在 php 变量中查找某些文本,然后替换两边字符之间的所有文本
- json - 疯狂地在 JSON 循环上排序数组函数
- license4j - 如何从 license4j API 获取许可证的最新“激活计数”
- react-native - React native:当我发送消息时,Flatlist 不会立即更新
- scatter-plot - 散点图点形状
- node.js - 抽屉组件背景阻止用户与页面交互是否会打开
- javascript - 为什么 ThreeJS 的翻译很慢?
- excel - 变量“i”未定义,但它在某个时间点工作
- python - FFMPEG 帧精确视频裁剪