2012-02-08 3 views
1

У меня есть список следующим образом:матрицы Reshape в список списков

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

Есть ли векторизованный способ выполнения этого?


EDIT: Удлинение первого вопроса, есть простой способ сделать то же самое для общей матрицы 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 

Edit:

Для отредактированных проблем, я бы с 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")) 
+0

@Andrie - Я обновил вопрос, включив в него более общий вопрос, не возражаете ли вы сделать второй взгляд? – eykanal

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

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

Смежные вопросы