【问题标题】:R: Nearest Neighbour Imputation for Non-NA possible?R:Non-NA 的最近邻插补可能吗?
【发布时间】:2015-02-12 05:42:51
【问题描述】:

我有这样的数据:

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

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

我想用最近邻替换状态“-1”,“NA”,“1”和“3”(不计算,只是替换下一个高于“50”的值)优先考虑左边的值/应该被替换的 case 左边的变量。

最后应该是这样的:

    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 以上的下一个值 - 这就是我所说的“左侧优先级”。

到目前为止,我刚刚体验了 impute-package 的随机插补,也看到了 knn-package,但据我了解,它只适用于 NA,对吧?

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

提前致谢!

【问题讨论】:

  • 为什么你的结果(第 3 行)中有 NA??
  • DF1["3","v6"] 应该是 400?
  • 第 4 行似乎也不符合您的规则。
  • 第 3 行中的 NA 是我设计此示例数据的错误...抱歉...它应该是 400。 - 第 4 行是一个示例,如果有超过 2 个缺失,值应取自一侧和另一侧(但如果 NA 的数量不均匀,则优先考虑左侧)

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


【解决方案1】:

这是一种方法,在包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

【讨论】:

  • 谢谢,我知道 na.locf,但没想到这么远 - 就我的理解而言:第三行从左侧开始填充,第四行从右侧开始填充,对吗?据我了解,“na.locf”一次替换一个值,所以如果我有例如 8 个缺失值,我将不得不执行代码的第 3 行和第 4 行四次?
  • 没有。代码按原样运行。 na.locf(...) 默认将所有 NAs 替换为最后一个非 NA 值。所以c(400,NA,NA,NA) 变成了c(400,400,400,400)。我建议您阅读文档,并研究中间结果。
猜你喜欢
  • 2019-09-26
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
相关资源
最近更新 更多