【问题标题】:Join list of matrices using xtabs inside for() loop在 for() 循环中使用 xtabs 加入矩阵列表
【发布时间】:2019-08-05 18:24:26
【问题描述】:

假设我们有一组不同维度的矩阵,但具有共同的行名和列名。我们想找到矩阵的元素方式。 xtabs() 是一个方便的函数。

但是,在for() 内部,as.table() 无法识别调用每个矩阵的表达式。首先创建一个矩阵列表,然后调用该列表的每个元素同样失败。

MWE:创建矩阵:

m1 <- matrix(1:9,nrow=3,ncol=3)
colnames(m1) <- c("A","B","C")
rownames(m1) <- c("A","B","C")
m2 <- matrix(10:18,nrow=3,ncol=3)
colnames(m2) <- c("A","B","C")
rownames(m2) <- c("A","B","C")
m3 <- matrix(19:22,nrow=2,ncol=2)
colnames(m3) <- c("A","B")
rownames(m3) <- c("A","B")

使用其中一个矩阵作为构建的基础:

A <- m1

加入并找到方法:

for(i in 2:3){
  mat <- noquote(paste0("m", i))
  B   <- rbind(as.data.frame(as.table(A)), as.data.frame(as.table(mat)))
  A   <- xtabs(Freq ~ Var1 + Var2, aggregate(Freq ~ Var1 + Var2, B, mean))
}

问题出在as.table(mat),导致报错:

Error in as.table.default(mat) : cannot coerce to a table

这只是一个工作示例,实际应用程序会在数千个具有不同命名约定的矩阵上重复此操作。将noquote(paste0("m", i)) 直接插入as.table() 也会失败。

直接用矩阵对象替换mat 就可以正常工作(即as.table(m2))。谢谢!

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    这里,我们需要get从字符串标识符对象中获取值

    for(i in 2:3){
        mat <- get(paste0("m", i))
        B   <- rbind(as.data.frame(as.table(A)), as.data.frame(as.table(mat)))
         A   <- xtabs(Freq ~ Var1 + Var2, aggregate(Freq ~ Var1 + Var2, B, mean))
    }
    
    A
    #    Var2
    #Var1     A     B     C
    #   A 12.25 14.75 11.50
    #   B 13.25 15.75 12.50
    #   C  7.50 10.50 13.50
    

    【讨论】:

    • 谢谢你...呃,有时候这些事情我都逃不过了。暂时接受。
    猜你喜欢
    • 2019-09-08
    • 2021-05-02
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 2022-01-09
    相关资源
    最近更新 更多