我有这样一个日期框架:

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

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

最佳答案

我们为分组列'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)

关于r - 从长到宽的结构R数据帧,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32721106/

10-12 17:55