首页 > 解决方案 > R Studio - 将df的二进制列映射到另一个的行详细信息并匹配?

问题描述

我在下面有这两个数据集 - “数据”,这是一个参加锦标赛的人的列表,用二进制列表示他们正在参加哪些比赛,以及“tourn_details”,它表示这些锦标赛发生的日期。

name <- c('Sarah', 'Josh', 'Ben')
tourn1 <- c(1, 1, 0)
tourn2 <- c(0, 1, 1)
tourn3 <- c(1, 0, 0)
data <- data.frame(name, tourn1, tourn2, tourn3)

tourns <- c("tourn1", "tourn2", "tourn3")
dates <- c("2020-01-01, 2020-01-02", "2020-01-01", "2020-01-02, 2020-01-03")
tourn_details <- data.frame(tourns, dates)

我现在正在尝试在“数据”中添加一个名为“比赛日期”的列,该列将列出竞争对手参加比赛的所有日期。例如,莎拉正在参加 tourn1 和 tourn3 - 使用 tourn_details,这个表示她在 1 月 1 日、1 月 2 日(巡回赛 1)和 1 月 2 日、1 月 3 日(巡回赛 3)参加比赛。她的“比赛日期”应该是“2020-01-01, 2020-01-02, 2020-01-02, 2020-01-03”(注意重复的日期)。

最后一部分是我想添加一个列,显示每个玩家从某个日期开始玩了多少场比赛。假设我将日期设置为 1 月 1 日 - 我想知道每个玩家有多少场比赛即将到来。对于 Sarah,在 1 月 1 日,这应该等于 3(因为她在 1 月 2 日玩两场比赛,在 1 月 3 日玩一场)。

提前谢谢,如果我能提供更多细节,请告诉我!

标签: rmatchdplyr

解决方案


library(tidyverse)

data %>% 
  dplyr::mutate(across(starts_with("tourn"), ~ ifelse(.x, cur_column(), NA))) %>% 
  tidyr::unite(tourn, starts_with("tourn"), sep = ", ", na.rm = T) %>%
  dplyr::rowwise() %>%
  dplyr::mutate(playing_dates = tourn_details[str_detect(tourn, tourn_details$tourns), "dates"] %>%
                  paste(collapse = ", "),
                upcoming = sum(as.Date(str_split(playing_dates, ", ")[[1]]) %in%
                                 seq(as.Date("2020-01-01"), length.out = 7, by = 1))) %>% 
  dplyr::ungroup()

输出

  name  tourn          playing_dates                                  upcoming
  <chr> <chr>          <chr>                                             <int>
1 Sarah tourn1, tourn3 2020-01-01, 2020-01-02, 2020-01-02, 2020-01-03        4
2 Josh  tourn1, tourn2 2020-01-01, 2020-01-02, 2020-01-01                    3
3 Ben   tourn2         2020-01-01                                            1   

您可以调整as.Date("2020-01-01")为您想要的任何开始日期。它会看起来 7 天。其工作原理是从您的开始日期开始创建一个日期序列 ( seq),一次一天 ( by = 1),直到该序列的长度为七个元素 ( length.out = 7)。


推荐阅读