【问题标题】:R Code: List containing column numbers to incrementR 代码:包含要递增的列号的列表
【发布时间】:2015-12-27 13:22:58
【问题描述】:

我有一个包含列号的列表:

list = list(c(1,4,5),c(2,4,2))
matrix = matrix(rep(0,10),ncol=5)

> list
[[1]]
[1] 1 4 5

[[2]]
[1] 2 4 2


> matrix
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    0    0
[2,]    0    0    0    0    0

我想要实现的是:

> matrix
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    0    0    1    1
[2,]    0    1    0    1    0

但是因为我的列表很大,我的矩阵也很大,所以我对循环不满意:

for (i in 1:length(list)) matrix[i,list[[i]]] = 1

【问题讨论】:

  • 您的解决方案被证明很慢,或者您只是不喜欢它使用循环的事实?
  • 另外,这样更好吗? library(data.table) ; setDT(melt(list))[, table(L1, factor(value, levels = min(value) : max(value)))]
  • 另一个选项是i1 <- as.matrix(transform(stack(setNames(list, seq_along(list))), ind= as.numeric(ind))[2:1]); matrix[i1] <- 1

标签: r loops lapply


【解决方案1】:

我们可以从library(Matrix)尝试sparseMatrix

library(Matrix)
sM <- sparseMatrix(i= rep(seq_along(list), lengths(list)), 
                    j= unlist(list),
                    x= 1)
as.matrix(sM)

不确定在同一 list 元素中重复的列号是否错字。如果不是错字,还是要二进制输出

+(!!(as.matrix(sM)))
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    1    0    0    1    1
#[2,]    0    1    0    1    0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 2017-05-31
    • 2013-10-02
    • 1970-01-01
    • 2016-04-13
    • 2013-01-15
    相关资源
    最近更新 更多