Работа с Tidyverse и базовой функцией R, которая

#r #tidyverse

Вопрос:

Здравствуйте, милые люди, так что я надеюсь, что вы в восторге, мне было так весело работать с функцией Base R «Которая», чтобы иметь дело с последовательностями, но в более широком масштабе я скоро буду использовать tidyverse для обсуждения некоторых данных, и я, кажется, не могу найти способ включить эти функции в tidyverse. Позвольте мне, пожалуйста, объяснить, что я хочу сделать:

У меня есть следующий набор данных

Студенты событие
Джеймс ГЕО_ЭКЗАМЕН
Джеймс PIZZA_PARTY
Кайли МАТЕМАТИЧЕСКИЙ АНАЛИЗ
Кайли PIZZA_PARTY
Лора МАТЕМАТИЧЕСКИЙ АНАЛИЗ
Марк МАТЕМАТИЧЕСКИЙ АНАЛИЗ
Марк PIZZA_PARTY

Я хочу иметь возможность сортировать события (для простоты эти события в нужном порядке), а затем группа студентов и найдите то, что мероприятие стало последним, или последнее события или каждый groug из studebts до PIZZA_PARTY (мы asumen приказ гос сверху вниз) набор данных, у меня есть oversiplified чтобы объяснил этот случай.

Это было сказано для предыдущего набора данных, у нас будет, что для Джеймса событие, предшествовавшее ВЕЧЕРИНКЕ с ПИЦЦЕЙ, было экзаменом по географии, для Кайли экзамен по математике, для Лоры не было события, предшествовавшего вечеринке с ПИЦЦЕЙ, и, наконец, для Марка это был экзамен по математике. Это был бы желаемый результат.

Но если я опущу тот факт, что я действительно хочу разрешить эту группировку отрывков по СТУДЕНТАМ, я мог бы легко использовать следующий код для начала

 df$EVENT[which(df$EVENT=="PIZZA_PARTY")-1]
 

но если я хочу использовать tidyverse для решения этой проблемы так, как я хочу, я бы использовал:

 df %>% 
  group_by(STUDENT) %>% 
  mutate(INDEX=(which(EVENT=="PIZZA_PARTY")-1))
 

но я получаю ошибку, я также получаю ошибку, когда использую summarize, и я чувствую, что ударяюсь об стену, так что большое вам спасибо, ребята, если бы вы могли меня направлять, или сообщите, какую литературу, блоги или книги я должен просмотреть, чтобы узнать, как правильно использовать базовые функции R с помощью tidyverse, или, пожалуйста, сошлитесь на некоторые ссылки или блоги, которые будут полезны для решения этой проблемы, большое вам спасибо

Ответ №1:

Проблема в том, что когда у нас есть группа с отсутствующим значением, т. Е. для «Лауры», его нет PIZZA_PARTY

 > subset(df, STUDENT == "Laura" amp; 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)
 

Если нам это нужно, чтобы создать переменную ОТВЕТА с соответствующим «СОБЫТИЕМ»

 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))
 

Комментарии:

1. Вы просто замечательны, большое вам спасибо, как будто вы понятия не имеете, большое спасибо, у меня есть последний вопрос, при всем уважении, я хотел бы использовать это число, хранящееся в ИНДЕКСЕ переменной, чтобы извлечь соответствующее событие по группам, но когда я пытаюсь использовать [] для этого, я теперь получаю ошибку, знаете ли вы, как это было бы правильно? например, в вашем удивительном коде говорится, что для группы Джеймс событие, предшествующее вечеринке с пиццей, находится в индексе 1. как я могу повторить имя этого события в переменной с именем «ОТВЕТ», большое спасибо, мой друг, как будто вы понятия не имеете, как много это значит!

2. Вам может понадобиться df %>% group_by(STUDENT) %>% mutate(RESPONSE = EVENT[match("PIZZA_PARTY", EVENT) - 1])

3. @R_Student вы хотите, чтобы вывод был таким же, как в обновлении

4. Мне так жаль, что я этого не видел, это было довольно любезно с вашей стороны @Akrun, ваши ответы были невозможны, спасибо большое спасибо

5. спасибо тебе огромное, мой друг, от всего сердца спасибо тебе

Ответ №2:

Вы можете использовать lead для получения события, после которого произошло следующее событие 'PIZZA_PARTY' .

 library(dplyr)

df %>%
  group_by(STUDENT) %>%
  summarise(last_event = EVENT[lead(EVENT == 'PIZZA_PARTY', default = FALSE)])

#  STUDENT last_event
#  <chr>   <chr>     
#1 James   GEO_EXAM  
#2 Kylie   MATH_EXAM 
#3 Mark    MATH_EXAM 
 

Комментарии:

1. На самом деле это зависит от того, как вы хотите получить результат. summarise обычно сохраняет только 1 строку для каждой группы ( STUDENT здесь). mutate сохранит то же количество строк.