【问题标题】:R: Index matrix row-wise in vectorsR:向量中的逐行索引矩阵
【发布时间】:2016-05-18 04:56:00
【问题描述】:

我有一个只包含字符元素的向量,比如说

v <- c("A","B","C")

和一个只包含逻辑元素的矩阵,其宽度等于v的长度和任意长度:

> M <- matrix(c(TRUE,FALSE,TRUE,FALSE,TRUE,TRUE),ncol=3,byrow=TRUE)
> M
      [,1]  [,2] [,3]
[1,]  TRUE FALSE TRUE
[2,] FALSE  TRUE TRUE

现在我想将M的每一行索引到v中,折叠,得到一个向量r,其中每个元素在一个字符表达式中包含M的对应行。在给出的示例中,r 的元素将是

> r
"A C" "B C"

我可以单独(或在一个循环中)为每一行执行此操作,使用

r[i] <- paste(v[as.logical(M[i,])], collapse="")

但希望有一个更有效的解决方案可以一次处理整个矩阵。

【问题讨论】:

    标签: r list matrix indexing


    【解决方案1】:

    我们可以使用apply 和MARGIN=1

    apply(M, 1, function(x) paste(v[x], collapse=' '))
    #[1] "A C" "B C"
    

    数据

     M <- matrix(c(TRUE,FALSE,TRUE,FALSE,TRUE,TRUE),ncol=3, byrow=TRUE)
    

    【讨论】:

    • 太棒了!然后我会使用 paste(v[x], collapse="") 而不是 toString() 来摆脱分隔符。
    • 非常感谢!刚刚注意到这个解决方案不允许在paste() 命令中添加额外的元素。例如,apply(M, 1, function(x) paste("x+", v[x], collapse=' ')) 将为每个元素添加一个x+,从而导致r[1] = "x+ A x+ B x+ C" 而不是r[1] = "x+ A B C"。你知道解决方法吗?
    • @Capsicum 试试apply(M, 1, function(x) paste('x',paste(v[x], collapse=' '), sep=' + '))#[1] "x + A C" "x + B C" 或只是paste('x', apply(M, 1, function(x) paste(v[x], collapse=' ')), sep=' + ')
    猜你喜欢
    • 2017-11-01
    • 2015-08-27
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 2021-03-24
    • 1970-01-01
    相关资源
    最近更新 更多