我有这样一个日期框架:
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/