我在程序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。
答案 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