r - 从长到宽的结构化 R Dataframe

标签 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 和每个 code.n 重复 3 次> 是按时间顺序排列的代码。

因此:

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

感谢任何帮助。

最佳答案

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

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

或者这可以在使用 dplyr 方法创建序列列之后通过 tidyrspread 完成

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

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

相关文章:

r - 具有 lavaan 交互作用的分类变量的效果编码?

r - 哪里可以下载以前版本的 R for mac?

r - 在ggplot2散点图中使用伪色来表示密度

r - 将特定字符添加到重复的字符串

python - texreg 的 RPy bool 值

regex - 在最后一次出现数字时拆分,取第二部分

r - 如何在不添加 "Row.names"列的情况下按行名合并数据帧?

c - 如何在 R 中查看通过 .Call() 调用的 C 代码的调用堆栈

r - 在 R 中创建到 DBMS 的连接

r - 连接 R 中两个值之间最接近的值