Arrays 用r中的数字序列逐行填充数组
我在r程序工作,需要帮助编写一些代码。我有一个50×3×8维的数组。此数组中的大多数单元格为零,但有些单元格为NA。我需要用一系列数字替换数组中的零,这样一行中的所有单元格都有相同的数字。该序列从1开始,运行到数组中的总行数。此外,NAs必须保留,因此不能覆盖带有NAs的单元。此外,有些行都是NAs,因此行序列将不完全是40050x8,而是更小的值。我已经找到了关于如何解决这个问题的每一部分的信息,但我正在努力以一种有效的方式将所有的部分整合在一起。我非常感谢您帮助我编写这个r代码。 例如,对于此阵列:Arrays 用r中的数字序列逐行填充数组,arrays,r,sequence,na,Arrays,R,Sequence,Na,我在r程序工作,需要帮助编写一些代码。我有一个50×3×8维的数组。此数组中的大多数单元格为零,但有些单元格为NA。我需要用一系列数字替换数组中的零,这样一行中的所有单元格都有相同的数字。该序列从1开始,运行到数组中的总行数。此外,NAs必须保留,因此不能覆盖带有NAs的单元。此外,有些行都是NAs,因此行序列将不完全是40050x8,而是更小的值。我已经找到了关于如何解决这个问题的每一部分的信息,但我正在努力以一种有效的方式将所有的部分整合在一起。我非常感谢您帮助我编写这个r代码。 例如,对于
就我所知,这是你想要的小比例的插图
## 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循环中进行替换
如果这不是您想要的,请澄清您的问题,提供示例输入和相应的期望输出
针对问题的编辑,还有两种方法:一种丑陋易懂的方法和一种完全太聪明的方法:
# 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
这将有助于提供一个较小的例子,说明你的具体目标。我想你也可以用一个简单的二维数组来解释这个问题,例如4x3值。此外,请更具体地介绍如何解决问题的每一部分-您可以使用此链接。谢谢您的输入。这几乎就是我要寻找的,但是,数字序列需要在数组中的矩阵之间继续,而不是从每个矩阵开始。在您的示例中,矩阵1将有序列的第1行,矩阵2将有编号为2到5的行,矩阵3将有编号为6到8的行。如何修改此代码,使数组的第一个矩阵中的单元格为1而不是2?不知道为什么这里是2。感谢您的输入。它给出了2,因为第一行a[1,]get 1,a[2,]中的零都丢失了,所以那里什么都没有,所以a[3,]get 2中的零是我最初如何解释您的问题的。是的!这正是我一直想做的。谢谢你的帮助。这是我在使用R方面向前迈出的一小步。感谢您抽出时间。
# 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