2012-02-08 43 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