r - R - 查找只有一个非缺失值的列,并用该唯一非缺失值填充其缺失值
问题描述
我有一个包含缺失数据 (NA) 的数据框。我想找到只有一个非缺失值的列,然后用该值填充这些列。例如,如果我的原始数据集是这样的:
df = data.frame(A=c(1,2,NA,NA,1), B=c(NA,NA,3,3,3), C=c(2,5,6,3,6), D = c(NA,1, NA,1,1))
A B C D
1 1 NA 2 NA
2 2 NA 5 1
3 NA 3 6 NA
4 NA 3 3 1
5 1 3 6 1
我想达到:
A B C D
1 1 3 2 1
2 2 3 5 1
3 NA 3 6 1
4 NA 3 3 1
5 1 3 6 1
我首先创建了这个函数来做我想做的事:(如果你有更好的选择,请告诉我)
fill_NAs <- function(x){
x %>% fill(., .direction = "up") %>%
fill(., .direction = "down")
}
然后我尝试使用 mutate_at 或 mutate_if 函数,但我无法让它工作。我的一些尝试如下:
1)
df= df %>% mutate_if ( ~ length(unique(na.omit(.)))==1, ~ fill_NAs(.))
我收到了这个错误:
mutate_impl(.data,dots)中的错误:评估错误:没有适用于“fill_”的方法应用于类“c('double','numeric')”的对象
.
2)
df_PMM_imp = df_PMM_imp %>% mutate_at(.,names(select_if(.,length(unique(na.omit(.)))==1)), ~ fill_NAs(.))
我收到了这个错误:
tbl_if_vars(.tbl, .predicate, caller_env(), .include_group_vars = TRUE) 中的错误:length(.p) == length(tibble_vars) 不是 TRUE
一般来说,我似乎无法理解 mutate_if 或 mutate_at 的逻辑,我总是遇到这样的问题。所以我的问题是:
1)实现我想要的正确语法是什么?2)为什么我在上面得到这些错误,我做错了什么?
提前谢谢了。
解决方案
您可以遍历列,检查唯一元素的长度,如果它只包含一个唯一元素,则NA
替换列中的s。NA
df[] <- lapply(df, function(x) {
y <- unique(na.omit(x))
if(length(y) == 1) {
x <- y
} else x
})
结果
df
A B C D
1 1 3 2 1
2 2 3 5 1
3 NA 3 6 1
4 NA 3 3 1
5 1 3 6 1
推荐阅读
- c# - 强制 C# 编译器使用带有 Linq 表达式参数的非泛型方法重载
- csv - 预期缩进块异常
- javascript - 如何使html数字输入回绕
- ckan - 保持CKAN在后台运行
- macos - 从命令行打开 Intellij 项目(maven 或 SBT)的有用快捷方式
- android - NestedScrollview 内的 RecyclerView 滚动不顺畅
- android - 无法通过 Jenkinsfile 运行“fastlane”命令
- ruby-on-rails - 如何在 mongodb 的 Rails 中编写 LIKE 语句
- python-3.x - SQLAlchemy-Flask 绑定不起作用 - NameError: name 'TABLE' is not defined
- python - Python 是否会垃圾收集在函数范围内不再引用的变量?