首页 > 解决方案 > 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)为什么我在上面得到这些错误,我做错了什么?

提前谢谢了。

标签: rmissing-datadplyr

解决方案


您可以遍历列,检查唯一元素的长度,如果它只包含一个唯一元素,则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

推荐阅读