我正在尝试找到一个用指定值替换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
替换为相应的值?
答案 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
更好。