用于按R中的因子组合多个列表的功能

时间:2015-07-24 22:51:12

标签: r

这就是我想要做的。我需要编写一个函数,让我们称之为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 

任何帮助都将受到高度赞赏。

2 个答案:

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