按行填充数组,r中包含一系列数字

时间:2017-11-29 22:14:40

标签: arrays r sequence na

我在程序r中工作,需要帮​​助编写一些代码。我有一个50乘3乘8维数组。此阵列中的大多数单元格为零,但有些单元格为NA。我需要用一系列数字替换数组中的零,以便一行中的所有单元格具有相同的数字。序列从1开始,并运行到数组中的总行数。此外,必须保留NA,因此不能覆盖具有NA的单元。此外,一些行都是NA,因此行序列不会精确地为400(50 x 8),而是更少。我已经找到了有关如何解决这个问题的每个部分的信息,但我正在努力将所有部分组合在一起,以一种有效的方式。我非常感谢您帮助编写此代码。
示例,对于这个数组:
Y'LT; -array(0,暗淡= C(10,3,2))
#add NAs
Y [4,2:3,1] LT; -NA
Y [8,1:3,1] LT; -NA
Y [10,1:3,2] LT; -NA 我需要用一个序列替换0,使得数组中的第一个矩阵的行编号为1到9(行1中的所有单元格= 1,2 = 2,依此类推,NAs保留在原位)。 Matrix 2的行数为10到18。

1 个答案:

答案 0 :(得分:1)

据我所知,这就是你想要的(在小范围内用于说明)。

## Set up example data 
## (you should provide something like this in your question!!)
set.seed(47)
d = c(5, 2, 3)
x = array(sample(c(0, NA), size = prod(d), replace = T), dim = d)
# set a row to all na:
x[2, , ] = NA

我们首先找到不是全部NA的行,并计算替换序列。然后我们在一个简单的for循环中进行替换。

r = ! apply(is.na(x), MARGIN = 1, all)
rows = which(r)
rn = seq_along(r[r])

for (i in seq_along(rows)) {
  x[rows[i], , ][x[rows[i], , ] == 0] = rn[i]
}

x
# , , 1
# 
#      [,1] [,2]
# [1,]   NA   NA
# [2,]   NA   NA
# [3,]   NA    2
# [4,]   NA   NA
# [5,]   NA   NA
# 
# , , 2
# 
#      [,1] [,2]
# [1,]    1   NA
# [2,]   NA   NA
# [3,]    2    2
# [4,]   NA    3
# [5,]   NA    4
# 
# , , 3
# 
#      [,1] [,2]
# [1,]    1    1
# [2,]   NA   NA
# [3,]   NA    2
# [4,]    3   NA
# [5,]   NA   NA

如果这不是您想要的,请澄清您的问题,提供样本输入和相应的所需输出。

解决问题的编辑,还有两种方法:丑陋可理解的方式和完全过于聪明的方式:

# sample data
set.seed(47)
d = c(5, 2, 3)
x = array(sample(c(0, NA), size = prod(d), replace = T), dim = d)

# nested for loopsr
r = !apply(is.na(x), c(1, 3), all)
counter = 0
for (k in 1:dim(x)[3]) {
    for (i in 1:dim(x)[1]) {
        if(r[i, k]) {
            counter = counter + 1
            x[i, , k] = x[i, , k] + counter
        }
    }
}
x

# now the clever way
# reset the data
set.seed(47)
x = array(sample(c(0, NA), size = prod(d), replace = T), dim = d)

xm = matrix(aperm(x, c(1, 3, 2)), ncol = 2)
axm = ! apply(is.na(xm), 1, all)
xm = xm + cumsum(axm)
aperm(array(c(xm), dim = d[c(1, 3, 2)]), c(1, 3, 2))
# , , 1
# 
#      [,1] [,2]
# [1,]   NA   NA
# [2,]    1    1
# [3,]   NA    2
# [4,]   NA   NA
# [5,]   NA   NA
# 
# , , 2
# 
#      [,1] [,2]
# [1,]    3   NA
# [2,]   NA    4
# [3,]    5    5
# [4,]   NA    6
# [5,]   NA    7
# 
# , , 3
# 
#      [,1] [,2]
# [1,]    8    8
# [2,]   NA    9
# [3,]   NA   10
# [4,]   11   NA
# [5,]   NA   NA