Добавить переменную группировки на основе ранжированных данных - PullRequest
1 голос
/ 29 января 2020

Рассмотрим следующий фрейм данных:

name <- c("Sally", "Dave", "Aaron", "Jane", "Michael")
rank <- c(1,2,1,2,3)
df <- data.frame(name, rank, stringsAsFactors = FALSE)

Я хотел бы создать переменную группировки (событие) на основе столбца ранга, например:

event <- c("Hurdles", "Hurdles", "Long Jump", "Long Jump", "Long Jump")
df_desired <- data.frame(name, rank, event, stringsAsFactors = FALSE)

Есть лотов из примеров того, как идти другим путем (создание ранжирующей переменной на основе группы), но я не могу найти того, кто делает то, что хотел бы .

Можно использовать filter, full_join, а затем fill, как показано ниже, но есть ли более простой способ?

library(tidyverse)
df <- df %>% 
  mutate(order = row_number())

df_1 <- df %>% 
  filter(rank == 1)
df_1$event <- c("Hurdles", "Long Jump")

df %>% 
  filter(rank != 1) %>% 
  mutate(event = as.character(NA)) %>% 
  full_join(df_1, by = c("order", "name", "rank", "event")) %>% 
  arrange(order) %>% 
  fill(event) %>%
  select(-order)

1 Ответ

4 голосов
/ 29 января 2020

Мы можем использовать cumsum для создания индекса

library(dplyr)
df %>% 
   mutate(event = c("Hurdles", "Long Jump")[cumsum(rank == 1)])
#      name rank     event
#1   Sally    1   Hurdles
#2    Dave    2   Hurdles
#3   Aaron    1 Long Jump
#4    Jane    2 Long Jump
#5 Michael    3 Long Jump

Или в base R (на всякий случай)

df$event <- c("Hurdles", "Long Jump")[cumsum(df$rank == 1)])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...