【问题标题】:Simplify loops and produce summary of list简化循环并生成列表摘要
【发布时间】:2015-09-09 16:36:57
【问题描述】:

我有两个矩阵,第一个 (mat1) 描述活动,第二个 (mat2) 描述共同存在(单独、伙伴、朋友)。

第一个问题:您能帮我简化以下代码行并摆脱循环吗? 此代码将在每个共同存在的情况下执行的活动存储在第三个矩阵 (mat3) 中(因此 mat2 的结果)。 我存储所有单独完成的活动,然后与合作伙伴一起,然后与朋友一起完成。 我将每个共同存在的第三个矩阵(3 次)存储在一个名为 MatriX 的列表中。

mat1 = structure(c("1", "2", "3", "4", "5", "6", "sleep", "sleep", "sleep", 
"sleep", "sleep", "sleep", "sleep", "eat", "eat", "tv", "tv", 
"tv", "sleep", "tv", "eat", "eat", "eat", "eat"), .Dim = c(6L, 
4L), .Dimnames = list(NULL, c("id", "t1", "t2", "t3")))

mat2 = structure(c("1", "2", "3", "4", "5", "6", "partner", "partner", 
"partner", "partner", "partner", "partner", "alone", "alone", 
"alone", "partner", "partner", "partner", "alone", "friends", 
"friends", "partner", "partner", "partner"), .Dim = c(6L, 4L), .Dimnames = list(
NULL, c("id", "t1", "t2", "t3")))



MatriX = vector('list',3)

for(i in 1:3){
  MatriX[[i]] <- matrix('0', ncol = ncol(mat1), nrow = nrow(mat1))
}

  for(j in 1:ncol(mat3)){
    for(i in 1:nrow(mat3)){
      if
      (mat2[i,j] == 'alone') 
      {MatriX[[1]][i,j] <- mat1[i,j]}  
    }
  }

  for(j in 1:ncol(mat3)){
    for(i in 1:nrow(mat3)){
       if
      (mat2[i,j] == 'partner') 
      {MatriX[[2]][i,j] <- mat1[i,j]}  

    }
  }

  for(j in 1:ncol(mat3)){
    for(i in 1:nrow(mat3)){
      if
      (mat2[i,j] == 'friends') 
       {MatriX[[3]][i,j] <- mat1[i,j]}  

     }
  }

 names(MatriX) <- c('alone', 'partner', 'friends')
 MatriX

第二个问题: 我需要获取存储在列表 MatriX 中的 3 个矩阵的摘要。

round(prop.table(table(MatriX$alone)), 2)
round(prop.table(table(MatriX$partner)), 2)
round(prop.table(table(MatriX$friends)), 2)

我想要的输出可能是这样的:

     Act Alone Partner Friends
1     0  0.83     0.5    0.92
2   eat  0.08    0.12    0.04
3 sleep  0.08    0.25    0.04
4    tv     0    0.12       0

【问题讨论】:

  • 你应该一次只问一个问题。而且您的第一个问题似乎是一系列代码审查任务,而不是编程问题。
  • @Frank 那么你建议我在哪里发布我的“代码审查任务”呢?这是我的代码效率问题,所以我不明白为什么这不是编程问题。
  • 我没有把它看成是关于效率的问题(比如,代码运行的速度);如果您有这样的问题,可以考虑使用performance 标签。如果您要求使用不使用循环的更简单的代码(就像这里的情况一样),那实际上与效率无关,尽管人们可能会说反对循环。有一个可能感兴趣的代码审查网站:codereview.stackexchange.com
  • @Frank - 好的,谢谢 - 我会检查你的链接。 (我仍在循环遍历超过一百万个案例的矩阵)。

标签: r loops matrix summary


【解决方案1】:

对于第一部分,您可以删除一个嵌套循环。

m1 <- matrix('0', ncol=ncol(mat1), nrow=nrow(mat1))
lst <- lapply(c('alone', 'partner', 'friends'), function(x) {
         m1[mat2==x] <- mat1[mat2==x]
         m1})
names(lst) <- c('alone', 'partner', 'friends')

第二部分可以通过melting 'lst' 并在长格式上应用table/prop.table 轻松完成。

library(reshape2)
round(prop.table(table(melt(lst)[3:4]), margin=2),2)
#       L1
#value   alone friends partner
#  0      0.83    0.92    0.50
#  eat    0.08    0.04    0.12
#  sleep  0.08    0.00    0.25
#  tv     0.00    0.04    0.12

【讨论】:

  • 矩阵声明后第一行的逗号之前缺少0。它应该是m1 &lt;- matrix(0, ncol=ncol(mat1), nrow=nrow(mat1))
  • @RHertel 是的,这是我的错误。我之前用NA 做过,然后在查看了OP 的代码后,更改为"0",但是当我复制/粘贴时,我使用了早期版本。非常感谢您指出错误。
猜你喜欢
  • 2020-08-07
  • 2016-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
  • 2020-05-19
相关资源
最近更新 更多