我有一个如下列表:
id | value
----------
4 600
4 899
7 19
13 4930
13 300
: :
有多个ID重复,每个重复都有一个唯一值。我想将其转化为如下内容:
id | list
----------
4 c(600, 899)
7 c(19)
13 c(4930, 300)
: :
是否有一种实现此目的的矢量化方法?
编辑:扩展第一个问题,是否有一种简单的方法可以为通用MxN矩阵做同样的事情?即,转过来:
id | value1 value2
-------------------
4 600 a
4 899 b
7 19 d
13 4930 e
13 300 a
: : :
进入这个:
id | list
----------
4 list(c(600, 899),c('a','b'))
7 list(c(19),c('b'))
13 list(c(4930, 300),c('e','a'))
: :
谢谢!
答案 0 :(得分:4)
包plyr
中的功能应该对此有所帮助。
在下面的示例中,我假设您的数据采用data.frame
的形式 - 即使它确实是一个列表,正如您所说,它应该是直接转换为data.frame:< / p>
dat <- data.frame(
id = c(4, 4, 7, 13, 13),
value = c(600, 899, 19, 4930, 300)
)
library(plyr)
dlply(dat, .(id), function(x)x$value)
结果是您指定的列表:
$`4`
[1] 600 899
$`7`
[1] 19
$`13`
[1] 4930 300
attr(,"split_type")
[1] "data.frame"
attr(,"split_labels")
id
1 4
2 7
3 13
答案 1 :(得分:4)
如果你想坚持使用基本功能,你也可以使用tapply
:
tapply(dat$value,dat$id,c)
$`4`
[1] 600 899
$`7`
[1] 19
$`13`
[1] 4930 300
编辑:
对于您编辑过的问题,我会选择split
和lapply
:
x <- lapply(split(dat[2:3],dat$id),c,use.names=F)
dput(x)
structure(list(`4` = list(c(600, 899), c("a", "b")), `7` = list(
19, "d"), `13` = list(c(4930, 300), c("e", "a"))), .Names = c("4", "7", "13"))
答案 2 :(得分:3)
我只是split()
数据:
d <- read.table(text = "id value
4 600
4 899
7 19
13 4930
13 300", header=T)
split(d$value, d$id)
$`4`
[1] 600 899
$`7`
[1] 19
$`13`
[1] 4930 300