我有一个数据框,其中某些列仅具有唯一值或NA。我想选择这些列,并用该列中唯一的非缺失变量填充这些列中的NA。
这是一个模拟数据:
df = data.frame( A = c(1,NA,1,1,NA), B = c(2,NA,5,2,5), C =c(3,3,NA,NA,NA))
#df
# A B C
#1 1 2 3
#2 NA NA 3
#3 1 5 NA
#4 1 2 NA
#5 NA 5 NA
我想获得:
#df
# A B C
#1 1 2 3
#2 1 NA 3
#3 1 5 3
#4 1 2 3
#5 1 5 3
到目前为止,我尝试过:
df = df %>%
map_if((length(unique(na.omit(.)))== 1), ~ unique(na.omit(.)))
df = df %>%
mutate_if((length(unique(na.omit(.)))== 1), ~ unique(na.omit(.)))
两个都给出了以下错误:
probe(.x,.p)中的错误:length(.p)== length(.x)不正确
有人可以告诉我实现我想要的正确语法是什么吗?
答案 0 :(得分:2)
也许我误解了您的问题,但这不只是fill
的问题吗?
df %>% fill(A, C)
# A B C
#1 1 2 3
#2 1 4 3
#3 1 5 3
#4 1 2 3
#5 1 5 3
要填充所有列,并确保填充以NA
开头的列,我们可以在两个方向(上下)上填充值:
df %>% fill(everything()) %>% fill(everything(), .direction = "down")
现在我已经理解了您的问题,我们可以在您的条件语句中使用mutate_if
来replace
个值
df %>%
mutate_if(
function(x) length(unique(na.omit(x))) == 1,
function(x) replace(x, is.na(x), unique(na.omit(x))))
# A B C
#1 1 2 3
#2 1 NA 3
#3 1 5 3
#4 1 2 3
#5 1 5 3
答案 1 :(得分:2)
我们可以检查mutate_if
中的条件,如果满足,则对整个列使用第一个非NA值
library(tidyverse)
df %>%
mutate_if(~n_distinct(.[!is.na(.)]) == 1, funs(.[!is.na(.)][1]))
# A B C
#1 1 2 3
#2 1 NA 3
#3 1 5 3
#4 1 2 3
#5 1 5 3
也可以按照@RHertel的建议编写
df %>% mutate_if(~n_distinct(.[na.omit(.)]) == 1, funs(na.omit(.)[1]))
为了更加清楚,我们可以创建函数并相应地使用它们
only_one_unique <- function(x) {
n_distinct(x[!is.na(x)]) == 1
}
first_non_NA_value <- function(x) {
x[!is.na(x)][1]
}
df %>% mutate_if(only_one_unique, first_non_NA_value)
我们可以使用相同的逻辑将所有内容保留在基本R中
only_one_unique <- function(x) {
length(unique(x[!is.na(x)])) == 1
}
first_non_NA_value <- function(x) {
x[!is.na(x)][1]
}
df[] <- lapply(df, function(x) if (only_one_unique(x))
first_non_NA_value(x) else x)