【问题标题】:Splitting a data frame into rows depending on dates根据日期将数据框拆分为行
【发布时间】:2020-08-14 09:49:12
【问题描述】:

我有两个数据框:

d1 <- data.frame(id=1,a=1,start_d1=10, end_d1=19)
d2 <- data.frame(id=1,b=2, start_d2=15, end_d2=24)

实际上,startend 是日期,数据框很大,但我想在这里保持简单。 现在我想加入id,然后根据各自的开始日期和结束日期重叠的位置获取新行。结果应该是一个数据框d:

     id   | a  | b  | start | end    
    ----------------------------
        1 | 1  | NA | 10 | 14
        1 | 1  | 2  | 15 | 19  
        1 | NA | 2  | 20 | 24


我现在在做什么:我加入d1d2 id 以获得d。 然后我将我编写的显式函数应用到d 中的每一行,该函数根据重叠将行拆分为新变量startend

这有点乱。有没有更简单的方法来解决我的问题?

【问题讨论】:

  • 嗨,预期的输出是多少。请dput()你的预期输出会很好。
  • 类似merged &lt;- merge(d1,d2,by=c('id','start','end'),all=T)
  • @TusharLad 不,这并没有给我们一个单独的行来表示开始和日期的重叠
  • 您可以在删除数据框名称中_ 之后的所有内容后使用rbind

标签: r


【解决方案1】:

我认为,将两个数据集连接起来,然后应用一个函数 row rise,然后用do.call rbinding 他们似乎是一种合理的方法。

我试图想出一个dplyr 的方法,但感觉更像是可憎的,而不是其他任何东西。

d1 <- data.frame(id=c(1,2),a=1, start_d1=c(10,20), end_d1=c(19,29))
d2 <- data.frame(id=c(1,2),b=2, start_d2=c(15,25), end_d2=c(24,34))

full_join(d1,d2) %>% 
  rowwise() %>% 
  do(data.frame(id = .$id,
                all_seq = seq(.$start_d1, .$end_d2, by = 1),
                a = c(rep(.$a, length(seq(.$start_d1, .$end_d1, by =1))),
                      rep(NA, length(seq(.$end_d1+1, .$end_d2, by = 1)))),
                b = c(rep(NA, length(seq(.$start_d1+1, .$start_d2, by =1))),
                      rep(.$b, length(seq(.$start_d2, .$end_d2, by = 1)))))) %>% 
  mutate(classifier = case_when(!is.na(a) && is.na(b) ~ 1,
                                !is.na(a) && !is.na(b) ~ 2,
                                is.na(a) && !is.na(b) ~ 3
                                )) %>% 
  ungroup() %>% 
  group_by(id, classifier) %>% 
  summarise(start = min(all_seq),
            end = max(all_seq),
            a = unique(a),
            b = unique(b)) %>% 
  select(-classifier)

Joining, by = "id"
# A tibble: 6 x 5
# Groups:   id [2]
     id start   end     a     b
  <dbl> <dbl> <dbl> <dbl> <dbl>
1     1    10    14     1    NA
2     1    15    19     1     2
3     1    20    24    NA     2
4     2    20    24     1    NA
5     2    25    29     1     2
6     2    30    34    NA     2

do-函数中的想法是根据idab 生成整个周期的序列。

【讨论】:

    猜你喜欢
    • 2016-09-28
    • 2018-02-24
    • 2016-06-24
    • 2018-04-18
    • 2021-08-21
    • 2021-10-04
    • 1970-01-01
    • 2021-08-16
    • 2022-10-18
    相关资源
    最近更新 更多