我有这样的数据:
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行)
提前致谢!
答案 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