Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:非NA的最近邻插补是否可能?_R_Replace_Conditional Statements_Nearest Neighbor_Knn - Fatal编程技术网

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)
。我建议您阅读文档,并研究中间结果。