2017-07-22 7 views
2

これは単なるサンプルデータフレームです。IDの最後の2つのイベントを取得し、アレンジする

enter image description here

私は、各id_numの最後の二つのイベントを取得し、それぞれEvent1Event2としてid_num最後の2つのイベントからなる別のデータフレームを作りたいです。それは行うことができますどのように

enter image description here

+3

画像を共有するのではなく、他の人が簡単にできるように、画像の 'dput'を共有しようとします。 –

答えて

1

これはdata.tableを使用して1行で行うことができます。

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 
1

(フロリアンのデータセット@で)tidyverseパッケージを使用してアイデア、

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 
+0

おっと、私の答えは本当に間違っていた。あなたの答えのデータセットは次のとおりです: 'df = data.frame(id_num = c(1,1,1,2,2,2)、event = c(" E1 "、" E2 "、" E3 "、" E3 "、" E4 "、" E5 ")) – Florian

0

あなたはaggregatetailと塩基Rでこれを行うことができます。

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 

あなたはaggregateの出力のデータ構造が第二列は行列で構成されて2つの列data.frameであるため、また、その結果にdo.calldata.frameを使用する必要があります。 do.callの後に、3列のdata.frameの望ましい構造が得られます。

関連する問題