我有一个像
这样的清单[[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并且以最快的速度(并行会很棒)的方式会很好。
答案 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