2012-02-08 42 views
1

我有一个列表如下:重塑基质成列表的列表

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')) 
: : 

谢谢!

回答

4

你也可以使用tapply如果你想坚持的基础功能:

tapply(dat$value,dat$id,c) 
$`4` 
[1] 600 899 

$`7` 
[1] 19 

$`13` 
[1] 4930 300 

编辑:

为您编辑的问题,我会去与splitlapply

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")) 
+0

@Andrie - 我更新了问题以包含更通用的问题,你介意再看一下吗? – eykanal 2012-02-08 16:13:14

4

plyr中的函数应该对此有所帮助。

在下面的例子中,我假设你的数据在一个data.frame形式 - 即使它真的是一个列表,就像你说的,它应该是直着转换为data.frame:

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 
+0

谢谢回答。数据在'data.frame'中,我仍然习惯于R术语。我会试试这个。 – eykanal 2012-02-08 14:41:25

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 
+0

我更新了问题以包含更通用的问题,你介意再看一下吗? – eykanal 2012-02-08 16:13:25