【问题标题】:Add a grouping variable based on ranked data根据排名数据添加分组变量
【发布时间】:2023-04-08 03:44:02
【问题描述】:

考虑以下数据框:

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)

lots of examples 采取另一种方式(根据组创建排名变量),但我似乎找不到一个做我想做的事。

可以使用filterfull_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)

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以使用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)])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 2016-07-02
      • 2015-08-27
      • 1970-01-01
      • 2015-09-22
      相关资源
      最近更新 更多