2017-01-23 121 views
3

我有我的数据帧:移调data.frame [R

Name Time Event 
Serg 15 Log1 
Nate 15 Log2 
Serg 10 Log3 
Nate 9 Log1 
Nate 20 Log5 

而且我想通过时间time这样的移调它为每一个Name

Name 1  2  3 
Serg Log3 Log1 NA 
Nate Log1 Log2 Log5 

希望我解释清楚!谢谢

+0

,名为SERG意外或做你挑'Log3' asthe第一排值故意? – sgp667

+0

没关系我看到模式 – sgp667

回答

4

我们可以从data.table使用dcast。通过创建一个序列ID(rowid - from data.table做'Name'变量),将'data.frame'转换为'data.table'(setDT(df1)),然后将dcast数据集转换为'wide'格式,公式,并指定value.var为 “事件”

library(data.table) 
dcast(setDT(df1)[order(Name, Time)], Name ~ rowid(Name), value.var = "Event") 
# Name 1 2 3 
#1: Nate Log1 Log2 Log5 
#2: Serg Log3 Log1 NA 

或者使用tidyverse

library(dplyr) 
library(tidyr) 
df1 %>% 
    group_by(Name) %>% 
    arrange(Name, Time) %>% 
    mutate(ind = row_number()) %>% 
    select(-Time) %>% 
    spread(ind, Event) 
# Name `1` `2` `3` 
#* <chr> <chr> <chr> <chr> 
#1 Nate Log1 Log2 Log5 
#2 Serg Log3 Log1 <NA> 
在desider输出
+0

输出不正确,因为名称Serg Log3必须位于第一列,因为它的时间小于Log1。 – Smasell

+0

@Smasell输出已更正。对不起,没有检查过订单 – akrun