R语言 根据所述第一维度中的所述第一索引中的值来替换数组值

zxlwwiss  于 2023-01-18  发布在  其他
关注(0)|答案(2)|浏览(122)

我有一个多维数组,我想根据第一维中第一个索引的值替换值,在下面的例子中,我想更改对应a1维度== 2的所有值,如果我只更改一个索引:

set.seed(2)
arr <- array(data=sample(1:2, 18, replace = TRUE), dim=c(3,3,2), dimnames=list(paste0("a",1:3),paste0("b",1:3),paste0("c",1:2)))
    
# replace second index according to first index of dimension 1
arr[2,,][arr[1,,]==2] <- NA

结果符合预期:

> arr
, , c1

   b1 b2 b3
a1  1  2  1
a2  1 NA  1
a3  2  2  1

, , c2

   b1 b2 b3
a1  2  2  1
a2 NA NA  2
a3  1  1  2

但如果我尝试像这样更改所有其他索引:

set.seed(2)
    arr <- array(data=sample(1:2, 18, replace = TRUE), dim=c(3,3,2), dimnames=list(paste0("a",1:3),paste0("b",1:3),paste0("c",1:2)))
        
        # replace second index according to first index of dimension 1
        arr[2:3,,][arr[1,,]==2] <- NA

它并不像我期望的那样工作。数组中的索引很难理解。我该如何正确地做呢?(当然,不用分别改变每个索引)。谢谢。
我希望结果是:

> arr
, , c1

   b1 b2 b3
a1  1  2  1
a2  1 NA  1
a3  2 NA  1

, , c2

   b1 b2 b3
a1  2  2  1
a2 NA NA  2
a3 NA NA  2
cgfeq70w

cgfeq70w1#

您可以使用rep来获取用于子集化的正确索引。

arr[2:3,,][rep(arr[1,,]==2, each=2)] <- NA

arr
#, , c1
#
#   b1 b2 b3
#a1  1  2  1
#a2  1 NA  1
#a3  2 NA  1
#
#, , c2
#
#   b1 b2 b3
#a1  2  2  1
#a2 NA NA  2
#a3 NA NA  2

或者更一般地说。

i <- 2:dim(arr)[1]
arr[i,,][rep(arr[1,,]==2, each=length(i))] <- NA

或者(感谢@jblood94提供此变体)

arr[-1,,][rep(arr[1,,]==2, each = nrow(arr) - 1)] <- NA

或者使用循环。

for(i in 2:nrow(arr)) arr[i,,][arr[1,,]==2] <- NA
xesrikrc

xesrikrc2#

这将是

arr[2:3,,][rep(arr[1,,]==2, each = 2)] <- NA

或者,更一般地说,根据第一行替换所有行:

arr[-1,,][rep(arr[1,,]==2, each = nrow(arr) - 1)] <- NA

相关问题