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

时间:2013-10-15 10:16:31

标签: r merge dataframe na

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

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

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)

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

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

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

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:1)

当然 - 这就是诀窍:

for(i in 1:nrow(data)) {
    missing <- which(is.na(data[i,]))
    if(i%%2) {
        data[i,missing] <- data[(i+1), missing]
    } else {
        data[i, missing] <- data[(i-1), missing]
    }
}

它允许在每对的顶行和底行中缺少观察值,并且在存在间隙的情况下,它填充来自该对的另一部分中的相同列位置的观察。

请注意,没有错误检查或其他好东西,所以这是非常原始的。

此外,如果它们是真正的数据对,那么加入观察结果的方法比将它们全部加入dataframe更好。