Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 用r中的数字序列逐行填充数组_Arrays_R_Sequence_Na - Fatal编程技术网

Arrays 用r中的数字序列逐行填充数组

Arrays 用r中的数字序列逐行填充数组,arrays,r,sequence,na,Arrays,R,Sequence,Na,我在r程序工作,需要帮助编写一些代码。我有一个50×3×8维的数组。此数组中的大多数单元格为零,但有些单元格为NA。我需要用一系列数字替换数组中的零,这样一行中的所有单元格都有相同的数字。该序列从1开始,运行到数组中的总行数。此外,NAs必须保留,因此不能覆盖带有NAs的单元。此外,有些行都是NAs,因此行序列将不完全是40050x8,而是更小的值。我已经找到了关于如何解决这个问题的每一部分的信息,但我正在努力以一种有效的方式将所有的部分整合在一起。我非常感谢您帮助我编写这个r代码。 例如,对于

我在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