97M 行の長いテーブルがあります。各行には、ユーザーが実行したアクションの情報とそのアクションのタイムスタンプが次の形式で含まれます。
actions <- c("walk","sleep", "run","eat")
people <- c("John","Paul","Ringo","George")
timespan <- seq(1000,2000,1)
set.seed(28100)
df.in <- data.frame(who = sample(people, 10, replace=TRUE),
what = sample(actions, 10, replace=TRUE),
when = sample(timespan, 10, replace=TRUE))
df.in
# who what when
# 1 Paul eat 1834
# 2 Paul sleep 1295
# 3 Paul eat 1312
# 4 Ringo eat 1635
# 5 John sleep 1424
# 6 George run 1092
# 7 Paul walk 1849
# 8 John run 1854
# 9 George sleep 1036
# 10 Ringo walk 1823
各アクションは、人によって実行されるか実行されない可能性があり、アクションはどのような順序で実行されてもかまいません。
データセットの一連のアクションを要約することに興味があります。特に、各人について、1 番目、2 番目、3 番目、4 番目に実行されたアクションを見つけたいと考えています。アクションが複数回実行された場合、最初に発生したアクションのみに関心があります。それから誰かが走って、食べて、食べて、走って、寝たらrun
、 、eat
、などの要約に興味がありsleep
ます。
df.out <- data.frame(who = factor(character(), levels=people),
action1 = factor(character(), levels=actions),
action2 = factor(character(), levels=actions),
action3 = factor(character(), levels=actions),
action4 = factor(character(), levels=actions))
forloop で必要なものを取得できます。
for (person in people) {
tmp <- subset(df.in, who==person)
tmp <- tmp[order(tmp$when),]
chrono_list <- unique(tmp$what)
df.out <- rbind(df.out, data.frame(who = person,
action1 = chrono_list[1],
action2 = chrono_list[2],
action3 = chrono_list[3],
action4 = chrono_list[4]))
}
df.out
# who action1 action2 action3 action4
# 1 John sleep run <NA> <NA>
# 2 Paul sleep eat walk <NA>
# 3 Ringo eat walk <NA> <NA>
# 4 George sleep run <NA> <NA>
この結果は、より効率的な方法でループなしでも取得できますか?