R-查找只有一个非缺失值的列,并用唯一的非缺失值填充其缺失值
我有一个包含缺失数据(NA)的数据框。我想找到只有一个非缺失值的列,然后用该值填充这些列。例如,如果我的原始数据集如下所示: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
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
})
Adplyr
方式:
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