我有两个列表x
和y
,以及一个索引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
是否是正确的功能,因为我从未见过它在任何地方使用过。
使用索引向量将值从一个列表插入另一个列表的最佳方法是什么?
答案 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"
这似乎是你想要的结果。