0

我试图找到一个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)

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

我希望用NA该对的相应值替换所有的,即NA用 30 替换第一对中的值。同样,用NA22 替换第 4 行中的值。

我可以执行一个循环来将每 2 行视为一对,并用NA同一对中的对应值替换找到的任何 s 吗?

4

2 回答 2

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

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

于 2013-10-15T10:35:19.563 回答
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.

于 2013-10-15T10:29:26.610 回答