按索引将一个列表中的值插入另一个列表中

时间:2014-09-06 02:02:40

标签: r

我有两个列表xy,以及一个索引where的向量。

x <- list(a = 1:4, b = letters[1:6])
y <- list(a = c(20, 50), b = c("abc", "xyz"))
where <- c(2, 4)

我想在y中将x插入where中的索引,以便结果为

list(a = c(1,20,2,50,3,4), b = c("a", "abc", "b", "xyz", "c", "d", "e", "f"))
#$a
#[1]  1 20  2 50  3  4
#
#$b
#[1] "a"   "abc" "b"   "xyz" "c"   "d"   "e"   "f"  

我一直在尝试使用append,但它不起作用。

lapply(seq(x), function(i) append(x[[i]], y[[i]], after = where[i]))
#[[1]]
#[1]  1  2 20 50  3  4
#
#[[2]]
#[1] "a"   "b"   "c"   "d"   "abc" "xyz" "e"   "f"  

这附加在错误的索引处。另外,我想在此过程中保留列表名称。我也不知道append是否是正确的功能,因为我从未见过它在任何地方使用过。

使用索引向量将值从一个列表插入另一个列表的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

在这里,我创建了一个APPEND函数,该函数是Reduce的迭代(append)版本:

APPEND <- function(x, where, y)
   Reduce(function(z, args)do.call(append, c(list(z), args)),
          Map(list, y, where - 1), init = x)

然后你只需要通过Map调用该函数:

Map(APPEND, x, list(where), y)

答案 1 :(得分:1)

mapply解决方案

怎么样?
x <- list(a = 1:4, b = letters[1:6])
y <- list(a = c(20, 50), b = c("abc", "xyz"))
where <- c(2, 4)

mapply(function(x,y,w) {
    r <- vector(class(x), length(x)+length(y))
    r[-w] <- x
    r[w] <- y
    r
}, x, y, MoreArgs=list(where), SIMPLIFY=FALSE)

返回

$a
[1]  1 20  2 50  3  4

$b
[1] "a"   "abc" "b"   "xyz" "c"   "d"   "e"   "f"  

这似乎是你想要的结果。