如何每n行转置一个长数据帧

时间:2018-10-01 16:56:16

标签: r tidyverse

我有一个像这样的数据框:

x=data.frame(type = c('a','b','c','a','b','a','b','c'),
value=c(5,2,3,2,10,6,7,8))

每个项目都有属性a,b,c,而某些记录可能缺少记录,即只有a和b

所需的输出是

y=data.frame(item=c(1,2,3), a=c(5,2,6), b=c(2,10,7), c=c(3,NA,8))

如何将x转换为y?谢谢

2 个答案:

答案 0 :(得分:2)

我们可以使用dcast

library(data.table)
out <- dcast(setDT(x),  rowid(type) ~ type, value.var = 'value')
setnames(out, 'type', 'item')
out
#   item a  b  c
#1:    1 5  2  3
#2:    2 2 10  8
#3:    3 6  7 NA

答案 1 :(得分:1)

假设每次出现g都会创建一个分组向量a,开始一个新的分组,使用tapply创建一个表tab并将其强制到数据帧。不使用任何软件包。

g <- cumsum(x$type == "a")
tab <- with(x, tapply(value, list(g, type), c))
as.data.frame(tab)

给予:

  a  b  c
1 5  2  3
2 2 10 NA
3 6  7  8

下面是分组向量的替代定义,该定义稍微复杂一些,但是如果某些组缺少a,则需要使用该定义。假设x按组中级别的顺序列出了type值,因此,如果某个级别小于先前级别,则它必须是新组的开始。

g <- cumsum(c(-1, diff(as.numeric(x$type))) < 0)

请注意,最终对失踪必须有一定的限制;否则,这个问题就模棱两可。例如,如果一个组可能缺少bc,然后下一个组可能缺少a,则第二组中的bc是否真正形成第二组或属于第一组是不确定的。