在R中加入一个参差不齐的数组

时间:2012-09-06 03:41:11

标签: r list join

我经常处理这种形式的对象:

v <- list(one = c(a = 1, b = 2, c = 3), two = c(a = 10, b = 20, d = 30, c = 40))

我希望通过元素名称外连接这些向量,以获得:

  index value.x value.y
1     a       1      10
2     b       2      20
3     c       3      40
4     d      NA      30

我已编写代码来执行此操作。简而言之,将向量转换为数据帧并通过连续合并减少。但是我想知道我是否一直在重新发明轮子,并且包中或R基座中包含一些功能,可能已经过优化。这似乎是一项非常普遍的任务。

3 个答案:

答案 0 :(得分:2)

不确定这会比您的方法更简单,但您可以使用reshape2lapply和as.list。我认为melt`dcast

library(reshape2)
dcast(melt(lapply(v, as.list)), L2 ~L1)
##   L2 one two
## 1  a   1  10
## 2  b   2  20
## 3  c   3  40
## 4  d  NA  30

答案 1 :(得分:2)

以下是基础R中的两个选项。他们需要先将list转换为data.frame

v2 <- data.frame(do.call(rbind, 
                         strsplit(names(unlist(v)), "\\.")), 
                 unlist(v))
names(v2) <- c("time", "id", "value")
xtabs(value ~ id + time, v2)
#     time
#  id  one two
#    a   1  10
#    b   2  20
#    c   3  40
#    d   0  30
reshape(v2, direction="wide", idvar="id", timevar="time")
#       id value.one value.two
# one.a  a         1        10
# one.b  b         2        20
# one.c  c         3        40
# two.d  d        NA        30

我不知道更直接的方法来分割使用names产生的unlist,但一旦完成,您尝试进行的操作变得更加容易。

分配新名称是为了使输出更“整洁”。

答案 2 :(得分:1)

这是一个基本解决方案:

> do.call( merge,  list(v[[1]], v[[2]], by="row.names", all=TRUE))
  Row.names  x  y
1         a  1 10
2         b  2 20
3         c  3 40
4         d NA 30

有关长度&gt; 2的更多列表,您可以使用as.data.frame.table从命名向量转换为双列data.frame

> v <- list(one = c(a = 1, b = 2, c = 3), 
           two = c(a = 10, b = 20, d = 30, c = 40), 
           three = c(a = 1, b = 2, c = 3))
> setNames(Reduce(function(x,y) {
        merge(x,y,all=T, by ='Var1')},lapply(v, as.data.frame.table)),
         c('index', names(v)))

  index one two three
1     a   1  10     1
2     b   2  20     2
3     c   3  40     3
4     d  NA  30    NA