这就是我想要做的。我需要编写一个函数,让我们称之为combine
,它接收多个列表并将它们组合在一起。要将多个列表传递给函数,我需要使用省略号作为函数的参数。我无法弄清楚如何正确组合函数内的列表。
将传递给函数的列表(所有这些列表都有一个共同的结构)有多个因子,其中一些是矩阵,另一些是数字向量。因此,例如,列表看起来像
list1 <- list(a= matrix(), b=numeric(), c=numeric())
我需要定义一个这样的函数:
combine <- function(...) {
#get all lists as lists or something that is convenient
all_lists <- list(...)
#define a list which will be returned
l <- list(a= list(), b=numeric(), c=numeric())
#l$a <- combine factor 'a' of all input lists as lists, use list()
#l$b <- cbind factor 'b' of all input lists as data frame, use cbind()
#l$c <- set union of elements of factor 'c' of input lists, use union()
return(l)
}
因此,如果我将三个列表传递给函数,则输出应该类似于
>l1 <- list(a= matrix(c(1:20), 10,2), b=c(1:11), c= c(1:5))
>l2 <- list(a= matrix(c(21:40), 10,2), b=c(11:21), c= c(2:7))
>l2 <- list(a= matrix(c(41:60), 10,2), b=c(21:31), c= c(3:6))
>l <- combine(l1, l2, l3)
>l$a[1]
[[1]]
[,1] [,2]
[1,] 1 11
[2,] 2 12
[3,] 3 13
[4,] 4 14
[5,] 5 15
[6,] 6 16
[7,] 7 17
[8,] 8 18
[9,] 9 19
[10,] 10 20
> l$b[4,3]
[1] 24
> l$c
[1] 1 2 3 4 5 6 7
任何帮助都将受到高度赞赏。
答案 0 :(得分:3)
您可以使用lapply
浏览所有列表并从每个列表中提取a,b或c,并将这些列表合并到您需要的位置。你有一个;对于b,您可以使用do.call('cbind', ...)
至cbind
列出的内容;而对于c只是union
或获得所有独特的元素
l1 <- list(a= matrix(c(1:20), 10,2), b=c(1:11), c= c(1:5))
l2 <- list(a= matrix(c(21:40), 10,2), b=c(11:21), c= c(2:7))
l3 <- list(a= matrix(c(41:60), 10,2), b=c(21:31), c= c(3:6))
combine <- function(...) {
all_lists <- list(...)
l <- list()
l$a <- lapply(all_lists, '[[', 'a')
l$b <- do.call('cbind', lapply(all_lists, '[[', 'b'))
l$c <- Reduce(union, lapply(all_lists, '[[', 'c'))
## or
# l$c <- unique(unlist(lapply(all_lists, '[[', 'c')))
l
}
l <- combine(l1, l2, l3)
l$a[1]
# [[1]]
# [,1] [,2]
# [1,] 1 11
# [2,] 2 12
# [3,] 3 13
# [4,] 4 14
# [5,] 5 15
# [6,] 6 16
# [7,] 7 17
# [8,] 8 18
# [9,] 9 19
# [10,] 10 20
l$b[4,3]
# [1] 24
l$c
# [1] 1 2 3 4 5 6 7
答案 1 :(得分:2)
我真的不知道你想要的输出是怎样的,但根据你的问题,这里有一个功能如下:
a
并将它们全部绑定到列表中。b
并将它们绑定到矩阵中。c
并统一。 combine <- function(...) {
#get all lists as lists or something that is convenient
all_lists <- list(...)
la <- lapply(all_lists, function(x) x$a)
lb <- sapply(all_lists, function(x) x$b)
lc <- unique( do.call(c,sapply(all_lists, function(x) x$c)) )
#define a list which will be returned
return(list(a=la,b=lb,c=lc))
}
l1 <- list(a= matrix(c(1:20), 10,2), b=c(1:11), c= c(1:5))
l2 <- list(a= matrix(c(21:40), 10,2), b=c(11:21), c= c(2:7))
l3 <- list(a= matrix(c(41:60), 10,2), b=c(21:31), c= c(3:6))
combine(l1,l2,l3)