获取id的最后两个事件并进行排列

时间:2017-07-22 10:49:50

标签: r data-analysis

这只是一个示例数据帧。

enter image description here

我想获取每个id_num的最后两个事件,并将另一个数据框分别包含id_num和最后两个事件Event1Event2。< / p>

enter image description here

怎么做?

3 个答案:

答案 0 :(得分:1)

使用tidyverse包(使用@ Florian数据集)的想法,

library(tidyverse)

df %>% 
 group_by(id_num) %>% 
 mutate(cnt = seq(n())) %>% 
 slice((last(cnt)-1):last(cnt)) %>% 
 spread(cnt, event)

# A tibble: 2 x 3
# Groups:   id_num [2]
#  id_num    `2`    `3`
#*  <dbl> <fctr> <fctr>
#1      1     E2     E3
#2      2     E4     E5

答案 1 :(得分:1)

这可以使用data.table在一行中完成。

library(data.table)
dt <- data.table(id_num = rep(1:3, 4), event = paste0("E", 1:12))
    #     id_num event
    #  1:      1    E1
    #  2:      2    E2
    #  3:      3    E3
    #  4:      1    E4
    #  5:      2    E5
    #  6:      3    E6
    #  7:      1    E7
    #  8:      2    E8
    #  9:      3    E9
    # 10:      1   E10
    # 11:      2   E11
    # 12:      3   E12

dt[, .(event_1 = .SD[(.N-1), event], event_2 = .SD[.N, event]), by = id_num] 
    #    id_num event_1 event_2
    # 1:      1      E7     E10
    # 2:      2      E8     E11
    # 3:      3      E9     E12

答案 2 :(得分:0)

您可以在基座R中使用aggregatetail执行此操作。

do.call(data.frame, aggregate(event~id_num, data=df, tail, 2))
  id_num event.1 event.2
1      1      E2      E3
2      2      E4      E5

您还需要对结果使用do.call data.frame,因为aggregate输出的数据结构是两列data.frame,其中第二列由矩阵组成。在do.call之后,我们得到了三列data.frame的所需结构。