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)

我现在正试图在";数据";称为";播放日期";这将是参赛者参加比赛的所有日子的列表。例如,Sarah参加了第1和第3场比赛-使用tourn_details,这意味着她将参加1月1日、1月2日(第一场比赛(和1月2、1月3日(第三场比赛(。她的";播放日期";应该说"2020-01-01、2020-01-02、2020-01-20220-01-03";(注意重复的日期(。

最后一部分是我想添加一个列,显示从某个日期起每个玩家玩了多少游戏。假设我把日期定在1月1日,我想知道每个玩家有多少场比赛。对于Sarah来说,在1月1日,这应该等于3(因为她在1月2日打两场比赛,1月3日打一场(。

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

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")调整为您想要的任何开始日期。它看起来会持续七天。这是通过创建一个日期序列(seq(来实现的,从开始日期开始,一天一次(by = 1(,直到该序列有七个元素长(length.out = 7(。

相关内容

最新更新