根据第一维中第一个索引的值替换数组值。

3

我有一个带有几个维度的数组。我想根据第一维中的值替换值。在下面的示例中,我想更改所有相应的 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 2nd & 3rd 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

还要注意arr[2,,]arr[2,,,drop=FALSE]之间的区别。 - GKi
2个回答

2
您可以使用 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

1
我已经添加了另一种使用 rep 的方法。这个可用吗? - GKi

1

这将会是

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

或者更普遍地说,基于第一行替换所有行:
arr[-1,,][rep(arr[1,,]==2, each = nrow(arr) - 1)] <- NA

更一般地说,arr[-1,,][rep(arr[1,,]==2, each = dim(arr)[1] - 1)] <- NA 即使用 dim(arr)[1] 而不是 nrow(arr) - Shajar
不,不是更一般化,就是一样的。看看nrow函数的定义:function(x) dim(x)[1L] - jblood94
nrow会给我第一个维度的长度(对吗?)。如果我想要使用另一个维度来达到同样的目的,我需要定义要使用哪个维度的长度。 - Shajar
使用 dim(x)[1L] 是正确的,这样可以更容易地将代码转换为使用除第一个维度之外的其他维度。 - jblood94

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接