您想要获得的数据格式的问题是它需要不同数量的列。当然,如果每个 最多有三个值id
,则可以只添加三列。id
但是对于具有 100 个值的 s 来说,这将变得相当复杂且难以处理。
解决方法是使用列表。在这里,列数不再固定。
使用列表归档所需内容的方法并不难:
d <- data.frame(id=c(3,3,4,4,4), num=c(8,12,15,18,24)) # Just your sample data
l <- with(d, tapply(num, id, c))
上面会发生什么?with
只是让我无需打字d$num
,d$id
并且对实际解决方案没有任何作用。关键在于tapply
。num
在这里,我们将by 的所有值分组id
并分别调用c
这些组。tapply
然后收集输出并返回一个最适合结果值的数据结构——在我们的例子中是一个列表。结果:
> l
$`3`
[1] 8 12
$`4`
[1] 15 18 24
您可以使用仅查询部分
> l[[1]] # The first element in the list
[1] 8 12
> l[['3']] # The element with key (id) `3`
[1] 8 12
还有一种方法。如果您希望将数字作为字符串粘贴到单个列中,这当然也是可能的:
> with(d, tapply(num, id, paste, collapse=' '))
3 4
"8 12" "15 18 24"