R:非NA的最近邻插补是否可能?
我有这样的数据:R:非NA的最近邻插补是否可能?,r,replace,conditional-statements,nearest-neighbor,knn,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)
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=40小时),1位数字表示就业状态。数据的问题是,我的目标是每月提供信息(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”中的2被替换为左边的值,另一个替换为右边50以上的下一个值——这就是我所说的“左边的优先级”
到目前为止,我刚刚体验过插补包的随机插补,我也见过knn包,但据我所知,它只适用于NA,对吗
我很感激任何提示,因为以.csv格式导出它并手动解析它将花费我10多个小时(11个数据集,每个数据集有100-200行)
提前谢谢 这里有一种方法,在package
zoo
中使用na.locf(…)
# 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
#将-1,1,3替换为NA
DF1为什么您的结果(第3行)中有一个NA
?DF1[“3”,“v6”]应该是400?第4行似乎也不符合您的规则。第3行中的NA是我设计此示例数据的错误。。。很抱歉应该是400英镑第4行是一个示例,如果有2个以上的缺失,则应分别从一侧和另一侧获取值(但如果NA的数量不均匀,则优先考虑左侧)。谢谢,我知道NA.locf,但没有考虑太多-据我所知:第三行从左侧填充,第四行从右侧填充,对吗?据我所知,“na.locf”一次替换一个值,因此,如果我有8个缺少的值,我必须执行代码的第3行和第4行四次?不。代码按原样运行na.locf(…)
默认情况下,将所有na
s替换为最后一个非na值。所以c(400,NA,NA,NA)
变成c(400400)
。我建议您阅读文档,并研究中间结果。