将NA替换为对中的对应值(2行为1对)

Yes*_*yyy 0 merge r dataframe na

我正在尝试找到一个NA用指定值替换's 的循环.

假设我有一个数据框如下(我实际上有更多的行):

a<-c(18,NA,12,33,32,14,15,55)
b<-c(18,30,12,33,32,14,15,NA)
c<-c(16,18,17,45,22,10,24,11)
d<-c(16,18,17,42,NA,10,24,11)
data<- data.frame(rbind(a,b,c,d))
names(data)<-rep(1:8)
Run Code Online (Sandbox Code Playgroud)

我的数据框中的所有行都是成对的(row[1]并且[2]是第一对,row[3]并且[4]是第二对,依此类推).

我希望用NA对应的值替换所有的,即NA在第一对中替换为30.同样,NA在第4行中替换为22.

是否有一个循环我可以执行将每两行作为一对处理并替换NA在同一对中找到的相应值的任何s?

Sim*_*lon 5

我使用R的内置向量化来找到并用NA适当的值替换s.当一行是奇数时,你想要用下面的行代替它,而当它是偶数时,你想要替换为上面的行......

# Locate NAs in data
nas <-  which( is.na( data ) , arr.ind = TRUE )
#  row col
#a   1   2
#d   4   5
#b   2   8

#  Where to get replacement value from: below on odd rows and value above on even rows
rows <- nas[,1] %% 2
rows[ rows == 0 ] <- -1
repl <- cbind( ( nas[,1] + rows ) , nas[ ,2] )

#  Do replacement
data[ nas ] <- data[ repl ]
#   1  2  3  4  5  6  7  8
#a 18 30 12 33 32 14 15 55
#b 18 30 12 33 32 14 15 55
#c 16 18 17 45 22 10 24 11
#d 16 18 17 42 22 10 24 11
Run Code Online (Sandbox Code Playgroud)

我确信替换位置矩阵的创建可能会更清晰,但这应该很快,因为它只使用矢量化操作.