Изменить матрицу в список списков - PullRequest
1 голос
/ 08 февраля 2012

У меня есть следующий список:

 id | value
 ----------
  4     600
  4     899
  7      19
 13    4930
 13     300
  :       :

Существует несколько повторений идентификатора, и каждый из них имеет уникальное значение.Я хочу превратить это в нечто следующее:

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

Спасибо!

Ответы [ 3 ]

4 голосов
/ 08 февраля 2012

Вы также можете использовать 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"))
4 голосов
/ 08 февраля 2012

Функции в пакете 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
3 голосов
/ 08 февраля 2012

Я бы просто 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...