首页 > 解决方案 > 使用 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 函数,或者请参考一些对解决此问题有用的链接或博客,非常感谢

标签: rtidyverse

解决方案


问题是当我们有一个缺失值的组时,即“劳拉”,没有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))

推荐阅读