#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
сохранит то же количество строк.