转置数据框 r

3

I have my data frame:

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

我想按时间为每个 Name时间 转置它,像这样:

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

Hope I explained clearly! Thanks


你的输出结果中,对于名为Serg的行,你选择Log3作为第一个值是出于意外还是有意而为之? - sgp667
没关系,我看到了这个模式。 - sgp667
1个回答

4
我们可以使用data.table中的dcast。将"data.frame"转换为"data.table" (setDT(df1)),然后通过创建序列id(rowid - data.table会对"Name"变量执行此操作)将数据集转换为"wide"格式,将其传递给公式,并将value.var指定为"Event"。
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>

输出不正确,因为在名称Serg中,Log3必须位于第一列,因为它的时间比Log1早。 - Smasell
@Smasell 输出已经更正。抱歉,在之前没有检查顺序。 - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接