簡體   English   中英

R:二進制列表的索引列表,包括空索引

[英]R: List of indices, including empty ones, to binary matrix

假設我有一個索引列表,其中包括空元素,例如:

l <- list(c(1,2,3), c(1), c(1,5), NULL, c(2, 3, 5))

在矩陣中指定非零元素,例如:

(m <- matrix(c(1,1,1,0,0, 1,0,0,0,0, 1,0,0,0,5, 0,0,0,0,0, 0,1,1,0,1), nrow=5, byrow=TRUE))
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    1    0    0
[2,]    1    0    0    0    0
[3,]    1    0    0    0    5
[4,]    0    0    0    0    0
[5,]    0    1    1    0    1

給定矩陣非常大(例如50.000行和2000列),使用R從l m的最快方法是什么?

您可以從'l' Filter非NULL列表元素,並使用melt將其重塑為帶有'key / value'列或'row / column'索引列的'data.frame'。

library(reshape2)
d2 <- melt(Filter(Negate(is.null), setNames(l, seq_along(l))))
Un1 <- unlist(l)
m1 <- matrix(0, nrow=length(l), ncol=max(Un1))
m1[cbind(as.numeric(d2[,2]), d2[,1])] <- 1
m1
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    1    1    1    0    0
#[2,]    1    0    0    0    0
#[3,]    1    0    0    0    1
#[4,]    0    0    0    0    0
#[5,]    0    1    1    0    1

要么

 library(Matrix)
 as.matrix(sparseMatrix(as.numeric(d2[,2]), d2[,1], x=1))
 #     [,1] [,2] [,3] [,4] [,5]
#[1,]    1    1    1    0    0
#[2,]    1    0    0    0    0
#[3,]    1    0    0    0    1
#[4,]    0    0    0    0    0
#[5,]    0    1    1    0    1

你可以做:

do.call(rbind, lapply(l, function(x) (1:max(unlist(l)) %in% x)+0L))

#     [,1] [,2] [,3] [,4] [,5]
#[1,]    1    1    1    0    0
#[2,]    1    0    0    0    0
#[3,]    1    0    0    0    1
#[4,]    0    0    0    0    0
#[5,]    0    1    1    0    1

即使akrun解決方案也應該更快!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM