r - 使用 Tidyverse 和基本 R 函数“哪个”
问题描述
你好,可爱的人,我希望你玩得开心,我一直在使用 Base R 函数“Which”来处理序列非常有趣,但在更大范围内,我很快将使用 tidyverse 进行一些数据整理和我似乎找不到将这些功能与 tidyverse 结合的方法。让我解释一下我想做什么:
我有以下数据集
学生 | 事件 |
---|---|
詹姆士 | GEO_EXAM |
詹姆士 | PIZZA_PARTY |
凯莉 | 数学考试 |
凯莉 | PIZZA_PARTY |
劳拉 | 数学考试 |
标记 | 数学考试 |
标记 | PIZZA_PARTY |
我希望能够对事件进行排序(为简单起见,这些事件按所需的顺序排列),然后按 STUDENT 分组,并在 PIZZA_PARTY 之前找到最后一个事件或最后一个事件或每组学生(我们将假设顺序从上到下)我拥有的数据集被过度简化以说明这种情况。
对于之前的数据集已经说过,对于 James 来说,PIZZA_PARTY 之前的事件是 GEO 考试,对于 Kylie 来说是 MATH 考试,对于 Laura 在 PIZZA_PARTY 之前没有事件,最后对于 Mark 来说是 MATH考试。这将是期望的结果。
但是如果我忽略了我确实想通过 STUDENTS 解决这个 excersie 分组的事实,我可以很容易地使用下面的代码来开始
df$EVENT[which(df$EVENT=="PIZZA_PARTY")-1]
但是如果我想以我想要的方式使用 tidyverse 来解决这个问题,我会使用:
df %>%
group_by(STUDENT) %>%
mutate(INDEX=(which(EVENT=="PIZZA_PARTY")-1))
但我得到一个错误,当我使用summary时我也得到一个错误,我觉得我正在碰壁,所以非常感谢你们,如果你能指导我或让我应该查看哪些文献、博客或书籍了解如何在 tidyverse 中正确使用基本 R 函数,或者请参考一些对解决此问题有用的链接或博客,非常感谢
解决方案
问题是当我们有一个缺失值的组时,即“劳拉”,没有PIZZA_PARTY
> subset(df, STUDENT == "Laura" & EVENT == "PIZZA_PARTY")
[1] STUDENT EVENT
<0 rows> (or 0-length row.names)
并因此返回logical(0)
。在mutate
中,它需要与行数相同的输出长度(或者如果它被分组,长度应该匹配相同数量的组元素)。请注意,即使是重复的值也可能导致相同的错误。所以,最好是获取第一个可用值的索引
library(dplyr)
df %>%
group_by(STUDENT) %>%
mutate(INDEX=which(EVENT == "PIZZA_PARTY")[1]-1)
-输出
# A tibble: 7 × 3
# Groups: STUDENT [4]
STUDENT EVENT INDEX
<chr> <chr> <dbl>
1 James GEO_EXAM 1
2 James PIZZA_PARTY 1
3 Kylie MATH_EXAM 1
4 Kylie PIZZA_PARTY 1
5 Laura MATH_EXAM NA
6 Mark MATH_EXAM 1
7 Mark PIZZA_PARTY 1
或者另一种选择是也使用match
df %>%
group_by(STUDENT) %>%
mutate(INDEX = match("PIZZA_PARTY", EVENT) - 1)
如果我们需要它来创建一个具有相应“事件”的 RESPONSE 变量
df %>%
group_by(STUDENT) %>%
mutate(RESPONSE = EVENT[match("PIZZA_PARTY", EVENT) - 1])
-输出
# A tibble: 7 × 3
# Groups: STUDENT [4]
STUDENT EVENT EVENTNEW
<chr> <chr> <chr>
1 James GEO_EXAM GEO_EXAM
2 James PIZZA_PARTY GEO_EXAM
3 Kylie MATH_EXAM MATH_EXAM
4 Kylie PIZZA_PARTY MATH_EXAM
5 Laura MATH_EXAM <NA>
6 Mark MATH_EXAM MATH_EXAM
7 Mark PIZZA_PARTY MATH_EXAM
数据
df <- structure(list(STUDENT = c("James", "James", "Kylie", "Kylie",
"Laura", "Mark", "Mark"), EVENT = c("GEO_EXAM", "PIZZA_PARTY",
"MATH_EXAM", "PIZZA_PARTY", "MATH_EXAM", "MATH_EXAM", "PIZZA_PARTY"
)), class = "data.frame", row.names = c(NA, -7L))
推荐阅读
- markdown - Pandoc 有文本替换宏吗?
- python - 在Python中用新值替换替换索引中给定位置的列表中的元素
- javascript - JS keycodes 和网站说的不一样?
- java - Android Studio 中特定日期的倒计时
- tomcat - logrotate 不旋转 catalina.out
- javascript - 将对象转换为映射数组?
- linux - 创建计划作业的用户权限 Centos
- java - 我怎样才能让洗牌器方法只洗牌数组中的某些索引?虽然不改组我想保持不变的索引
- javascript - 如何检测文件是否存在于 JavaScript 占 404 处理程序
- c# - 将一些 XML 元素添加到 DataTable.WriteXML (C#) 生成的 XML 的最优雅方法是什么