我有一个数据表,带有键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
答案 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
它与您想要的输出不完全相同,但无论如何它都可以实现。