我有一个像这样的数据框:
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?谢谢
答案 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)
请注意,最终对失踪必须有一定的限制;否则,这个问题就模棱两可。例如,如果一个组可能缺少b
和c
,然后下一个组可能缺少a
,则第二组中的b
和c
是否真正形成第二组或属于第一组是不确定的。