R:非NA的最近邻估算可能吗?

时间:2014-12-13 17:49:30

标签: r replace conditional-statements nearest-neighbor knn

我有这样的数据:

v1 = c( -1, 1, 420, 400, 400, 170, 420) 
v2 = c( 350, 460, 420, 400, 500, 170, 420) 
v3 = c( 350, 460, 420, 1, 500, 3, 1) 
v4 = c( 1, NA, 420, 1, NA, 170, 420) 
v5 = c( 350, 400, 400, 1, 1, 3, 300) 
v6 = c( 350, 400, NA, 500, 500, 170, 300)
v7 = c(7,400,200,7,500,170,7)

DF1= data.frame(v1, v2, v3, v4, v5, v6, v7)

导致表/ DF如下:

    v1  v2  v3  v4  v5  v6  v7
1   -1  350 350 1   350 350 7
2   1   460 460 NA  400 400 400
3   420 420 420 420 400 NA  200
4   400 400 1   1   1   500 7
5   400 500 500 NA  1   500 500
6   170 170 3   170 3   170 170
7   420 420 1   420 300 300 7

3位数字是工作时间(400 = 40h),一位数是就业状态。数据问题是,我的目标是月度信息(v1-v7是几个月),但我每年只调查一次工作时间。所以我把它放在各州,现在我有相同的空白填补。

我想更换状态" -1"," NA"," 1"和" 3"与最近邻居(没有计算,只是替换高于" 50"的下一个值)优先考虑左边的值/应该更换的案​​例左边的变量。

最后应该看起来像:

    v1  v2  v3  v4  v5  v6  v7
1   350 350 350 350 350 350 7
2   460 460 460 460 400 400 400
3   420 420 420 420 400 NA  200
4   400 400 400 400 500 500 7
5   400 500 500 500 500 500 500
6   170 170 170 170 170 170 170
7   420 420 420 420 300 300 7

注意第4行" 1"其中替换为左边的值,而一个右边的值超过50,这就是我的意思"左边的优先级"。

到目前为止,我只是对impute-package的随机误操作经验而且我已经看过knn-package,但根据我的理解,它只适用于NA,对吗?

我很感激任何提示,因为在.csv中导出并手动解析它需要10个多小时(11个数据集,每个100-200行)

提前致谢!

1 个答案:

答案 0 :(得分:2)

这是一种方法,使用包na.locf(...)中的zoo

# replace -1,1,3 with NA
DF1 <-  as.data.frame(sapply(DF1,function(x){x[x %in% c(-1,1,3)]<-NA;x}))
library(zoo)
# carry last obs forward into NAs, retaining NA at the beginnig of each row
result <- apply(DF1,1,na.locf,na.rm=FALSE)
result <- as.data.frame(t(apply(DF1,1,na.locf,fromLast=TRUE)))
result
#    v1  v2  v3  v4  v5  v6  v7
# 1 350 350 350 350 350 350   7
# 2 460 460 460 400 400 400 400
# 3 420 420 420 420 400 200 200
# 4 400 400 500 500 500 500   7
# 5 400 500 500 500 500 500 500
# 6 170 170 170 170 170 170 170
# 7 420 420 420 420 300 300   7