Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.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-查找只有一个非缺失值的列,并用唯一的非缺失值填充其缺失值_R_Missing Data_Mutate - Fatal编程技术网

R-查找只有一个非缺失值的列,并用唯一的非缺失值填充其缺失值

R-查找只有一个非缺失值的列,并用唯一的非缺失值填充其缺失值,r,missing-data,mutate,R,Missing Data,Mutate,我有一个包含缺失数据(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 for (i in 1:nco

我有一个包含缺失数据(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 
for (i in 1:ncol(df)) {
    if (any(is.na(unique(df[i]))) == TRUE & nrow(unique(df[i])) == 2) {
        df[i] <- unlist(rep(na.omit(unique(df[i])), nrow(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 
我首先创建这个函数是为了做我想做的:(如果你有更好的选择,请告诉我)

我得到了这个错误:

mutate_impl(.data,dots)中出错:评估错误:不适用 应用于类“c('double')的对象的“fill_u2;”的方法, “数字”)

(二)

我得到了这个错误:

tbl_if_变量(.tbl、.predicate、调用者_env()中出现错误, .include_group_vars=TRUE):长度(.p)==长度(tibble_vars)为 不正确

总的来说,我似乎无法理解mutate_的逻辑,如果或者mutate_at,我总是遇到这样的问题。因此,我的问题是:

1) 实现我想要的正确语法是什么? 2) 为什么我会出现上述错误,我做错了什么


非常感谢。

Hi@Elif Cansu Akoğuz

通过使用
for()
-循环迭代数据帧,然后检查每列是否满足您的要求,您可以非常轻松地实现目标:

for (i in 1:ncol(df)) {
    if (any(is.na(unique(df[i]))) == TRUE & nrow(unique(df[i])) == 2) {
        ...
    }
}
使用语句
any(is.na(unique(df[i]))
检查列中是否有
na
,使用
nrow(unique(df[i])==2检查列是否只包含两个唯一值。因此,如果一列同时满足这两个语句,您就知道它由两个值组成,其中一个在
NA

接下来,您要用非
NA
的值替换列中的所有值。要做到这一点,您可以使用
na.omit()
抛出
na
值,然后重复剩余值,不管数据帧有多长。 问题是,这将返回列表格式,因此必须使用
unlist()
-函数来解决此问题

整个循环将以如下方式结束:

  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 
for (i in 1:ncol(df)) {
    if (any(is.na(unique(df[i]))) == TRUE & nrow(unique(df[i])) == 2) {
        df[i] <- unlist(rep(na.omit(unique(df[i])), nrow(df)))
    }
}
for(1中的i:ncol(df)){
if(any)(is.na(unique(df[i]))==TRUE和nrow(unique(df[i]))==2){

df[i]您可以迭代您的列,检查非
NA
的唯一元素的长度,如果列中只包含单个唯一元素,则替换列中的
NA
s

df[] <- lapply(df, function(x) {
  y <- unique(na.omit(x))
  if(length(y) == 1) {
    x <- y
  } else x
})

A
dplyr
方式:

library(dplyr)

df %>% 
  mutate_all(~ case_when(
    n_distinct(.[na.omit(.)]) == 1 ~ first(na.omit(.)),
    TRUE ~ .
    )
  )
输出:

   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

我不完全理解您想用什么来取代NAs。
library(dplyr)

df %>% 
  mutate_all(~ case_when(
    n_distinct(.[na.omit(.)]) == 1 ~ first(na.omit(.)),
    TRUE ~ .
    )
  )
   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