【问题标题】:Assigning NA to the Matrix entries in R将 NA 分配给 R 中的矩阵条目
【发布时间】:2021-09-10 07:25:48
【问题描述】:

我想创建一个矩阵,其中每行的条目是随机选择的。我希望矩阵具有同一列中的每一行具有不同值的属性。如果同一列中的不同行(例如第 i 行和第 i+1 行)具有相同的值,那么我想用 NA 替换第 i+1 行的条目。基本上,我希望该列的每一行都有不同的条目。例如,第 1 列条目是 (1,2,2,4,1)。然后,我想将此列条目设为 (1,2,NA,4,NA)。这个我试过了

solution = matrix(NA,nrow=5,ncol=5)
for (i in 1:5) {
 for (j in 1:5) {
  one_entry  = sample(1:10, 1) 
  solution[j,i] = one_entry
  if (solution[j+1,i]==solution[j,i]){
   #is.na(solution[j+1,i]) <- solution[j+1,I]
   solution[j+1,i]<- NA
   #solution[solution[j+1,i]] <- NA
  } else {
    solution[j+1, i] = one_entry
  }
  }
}
print(solution)

我收到错误“if (solution[j + 1, i] == solution[j, i]) { 中的错误: 需要 TRUE/FALSE 的缺失值”。请帮助解决此问题。

【问题讨论】:

  • j+1 最多 5 行,但您只有 4 行。
  • @AndrewGustar 我已经编辑过了,但我认为这里不是这样吗?它在没有 if 条件的情况下工作。我确定问题出在 NA 问题上,但不知道如何解决它

标签: r matrix na


【解决方案1】:

您可以使用 NA 替换重复的条目,而不是使用 if 语句进行逐元素比较。 duplicated() 的输出是一个逻辑向量,将重复的位置设置为 TRUE。

set.seed(1)
nr <- 5
nc <- 7
m <- matrix(sample(1:10, nr * nc, replace = TRUE), nrow = nr)
m

#      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
# [1,]    9    7    5    9    5    1   10
# [2,]    4    2   10    5    5    4    6
# [3,]    7    3    6    5    2    3    4
# [4,]    1    1   10    9   10    6    4
# [5,]    2    5    7    9    9   10   10

for (i in seq_len(nc)) {
  m[, i][duplicated(m[, i])] <- NA
}

m

#      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
# [1,]    9    7    5    9    5    1   10
# [2,]    4    2   10    5   NA    4    6
# [3,]    7    3    6   NA    2    3    4
# [4,]    1    1   NA   NA   10    6   NA
# [5,]    2    5    7   NA    9   10   NA

【讨论】:

  • 对非方阵有用吗?我试过了,但当我使用 seq_len(ncol) 或 seq_len(nrow) 时它不起作用。有什么具体原因吗?另外,这不是我想要的。我希望每一列的每一行(或 NA)都有不同的条目。
  • 是的 - 通过一些调整,它也适用于非方阵。我不确定你是如何使用 seq_len(ncol) 的。如果我看到你的代码,我可能会给你更多有用的反馈。我已经根据您的问题更新了答案。它看起来更直接 - 使用 duplicated() 就可以了。
  • 嗨,这就是我想要的。我还发现使用 unique() 函数也有助于删除重复项。
【解决方案2】:

使用purrr 库:

library(purrr)

set.seed(123)

#populate the matrix
(mat <- rerun(5, sample(1:10,size = 5, replace = TRUE)) %>%
        reduce(cbind))
#>      out elt elt elt elt
#> [1,]   3   5   5   3   9
#> [2,]   3   4   3   8   3
#> [3,]  10   6   9  10   4
#> [4,]   2   9   9   7   1
#> [5,]   6  10   9  10   7

map(2:length(mat), ~{ if (mat[[. - 1]] == mat[[.]]) .x } ) %>%
  compact() %>% 
  walk(~{ mat[[.x]] <<- NA })

mat
#>      out elt elt elt elt
#> [1,]   3   5   5   3   9
#> [2,]  NA   4   3   8   3
#> [3,]  10   6   9  10   4
#> [4,]   2   9  NA   7   1
#> [5,]   6  10  NA  10   7

reprex package (v2.0.0) 于 2021-06-28 创建

【讨论】:

  • 对我来说看起来很复杂。另外,我希望每一列的每一行(或 NA)都有不同的条目。谢谢
猜你喜欢
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 2020-08-08
  • 2017-12-22
相关资源
最近更新 更多