结构R数据帧从长到宽

时间:2015-09-22 15:36:44

标签: r

我有一个日期框架:

long <- data.frame(subj = c(1,1,2,2,2), code = c("a", "b", "a", "d", "e"))

   subj code
 1    1    a
 2    1    b
 3    2    a
 4    2    d
 5    2    e

我似乎无法在这样的数据中构建数据code为每个subj重复3次,并且在每个code.n中按时间顺序重复代码。

因此:

   subj code.1 code.2 code.3
 1    1      a      b   <NA>
 2    2      a      d      e

任何和所有帮助表示赞赏。

1 个答案:

答案 0 :(得分:8)

我们为分组列'subj'创建一个序列列,然后执行dcast。我们可以使用dcast中的data.table。将'data.frame'转换为'data.table'(setDT(long)),按'subj'分组,创建序列列'new',并使用dcast从'long'转换为'wide'

library(data.table)#v1.9.6+
setDT(long)[, new:=paste('code', 1:.N, sep='.'), by = subj]
dcast(long, subj~new, value.var='code')

使用spread方法创建序列列后,可以使用tidyr dplyr来完成此操作

library(dplyr)
library(tidyr)
long %>% 
    group_by(subj) %>% 
    mutate(new=paste('code', row_number(), sep='.')) %>% 
    spread(new, code)