将矩阵重塑为列表列表

时间:2012-02-08 14:21:19

标签: r

我有一个如下列表:

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

谢谢!

3 个答案:

答案 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

编辑:

对于您编辑过的问题,我会选择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"))

答案 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