R特殊重塑数据表

时间:2014-10-22 11:04:01

标签: r data.table reshape

我有一个数据表,带有键ID和带有文本值的列。 密钥id不是唯一的(一些行共享相同的id;可能有1到8行具有相同的id)。我想要一个数据表,具有唯一的键ID和8列。

例如,我有什么:

require(data.table)
set.seed(1)
out<-data.table(id=c(rep("id1",3),rep("id2",2),"id3"),value=paste("value",round(rnorm(6,0,100))))
out
#     id     value
# 1: id1  value 49
# 2: id1  value 74
# 3: id1  value 58
# 4: id2 value -31
# 5: id2 value 151
# 6: id3  value 39

期望的输出:

data.table(id=c("id1","id2","id3"),value1=c("value -63","value 160","value -82"),value2=c("value 18","value 33",NA),value3=c("value -84",NA,NA))
#    id    value1   value2    value3
#1: id1 value -63 value 18 value -84
#2: id2 value 160 value 33        NA
#3: id3 value -82       NA        NA

2 个答案:

答案 0 :(得分:4)

您可以尝试:(setnames部分由@David Arenburg提供)

 res <- setnames(dcast.data.table(out[, N:=1:.N,by=id], id~N, value.var="value"),
                                                     2:4, paste0("value", 1:3))
 res   
 #     id   value1    value2        value3
 # 1: id1 value -63 value 18 value -84
 # 2: id2 value 160 value 33        NA
 # 3: id3 value -82       NA        NA

@David Arenburg建议的紧凑版本

 dcast.data.table(out[, N := paste0('value', 1:.N), by = id],
                                    id ~ N, value.var = "value")

答案 1 :(得分:0)

您会考虑aggregate

aggregate(value~id,data=out,FUN=paste,collapse=" ")

id                        value
1 id1 value -63 value 18 value -84
2 id2           value 160 value 33
3 id3                    value -82

它与您想要的输出不完全相同,但无论如何它都可以实现。