答案 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中使用aggregate
和tail
执行此操作。
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的所需结构。