将多维列表合并为一个

时间:2017-02-05 15:37:26

标签: r list parallel-processing

我有一个像

这样的清单
[[1]]
NULL

[[2]]
NULL

[[3]]
     i index
[1,] 3  6359

(...)

[[7]]
NULL

[[8]]
     i index
[1,] 8  1609
[2,] 8  2197
[3,] 8  3045

[[9]]
     i index
[1,] 9  1342
[2,] 9  5831

[[10]]
NULL

并使用

创建
  temp <- parSapply(cl,seq_along(source),function(i){ 
    index <- which(target[,col]==source[i])
    if(length(index)!=0)
      cbind(i,index)
  })

我想将此列表转换为另一个列表或数据框,如

i index
3 6359
8 1609
8 2197
8 3045
9 1342
9 5831

以某种方式我快速获得整个列的temp [[1]]或temp [,1]等。没有rbind并且以最快的速度(并行会很棒)的方式会很好。

3 个答案:

答案 0 :(得分:2)

我们可以使用base R

执行此操作
do.call(rbind, lst)
#     i index
#[1,] 3  6359
#[2,] 8  1609
#[3,] 8  2197
#[4,] 8  3045
#[5,] 9  1392
#[6,] 9  5831

或其他选项rbindlist来自data.table

library(data.table)
rbindlist(lapply(lst, as.data.table))
#   i index
#1: 3  6359
#2: 8  1609
#3: 8  2197
#4: 8  3045
#5: 9  1392
#6: 9  5831

数据

lst <- list(NULL, NULL, structure(c(3, 6359), .Dim = 1:2, .Dimnames = list(
NULL, c("i", "index"))), NULL, structure(c(8, 8, 8, 1609, 
2197, 3045), .Dim = c(3L, 2L), .Dimnames = list(NULL, c("i", 
"index"))), structure(c(9, 9, 1392, 5831), .Dim = c(2L, 2L), .Dimnames = list(
NULL, c("i", "index"))), NULL)

答案 1 :(得分:1)

由于您的代码出错,我创建了一个示例list

l = list(a = matrix(c(a = 1, b = "a"), ncol = 2), 
         b = matrix(c(a = c(2,3), b=c("a","b")), ncol = 2), 
         c = NULL)
#l
#$a
#     [,1] [,2]
#[1,] "1"  "a" 
#
#$b
#     [,1] [,2]
#[1,] "2"  "a" 
#[2,] "3"  "b" 
# 
#$c
#NULL

l <- lapply(l,  as.data.frame) # converting each `matrix` to `data.frame` since bind_rows works on this only
#l
#$a
#  V1 V2
#1  1  a
# 
#$b
#  V1 V2
#1  2  a
#2  3  b
# 
#$c
#data frame with 0 columns and 0 rows

library(dplyr)
bind_rows(l1)
#  V1 V2
#1  1  a
#2  2  a
#3  3  b

答案 2 :(得分:0)

您可以按如下方式使用purrr :: map:

我创建了一个示例列表dat

# sample list
dat <- list(NULL,NULL,
            matrix(c(3,6359),nrow=1),
            matrix(c(9,9,1342,5831),nrow=2)
)

> dat
[[1]]
NULL

[[2]]
NULL

[[3]]
     [,1] [,2]
[1,]    3 6359

[[4]]
     [,1] [,2]
[1,]    9 1342
[2,]    9 5831

不,您可以执行以下操作:

  • 将矩阵转换为数据帧

  • 如果您不想在结果中使用NA,请删除NULL

  • 使用purrr :: map提取值并创建新数据框

# convert matrices to dataframes
dat <- sapply(dat,data.frame)

# remove NULL entries
dat <- dat[lengths(dat) > 0] # Don't use, if you wat to keep NAs

# use map to extract the values
res <- data.frame(i=map(dat,"X1", .null = NA) %>% unlist,
                  index=map(dat,"X2", .null = NA) %>% unlist)

结果是:

> res
  i index
1 3  6359
2 9  1342
3 9  5831