簡體   English   中英

如何選擇僅包含NA和唯一值的列,並用該值填充NA?

[英]How to choose columns with only NAs and a unique value and fill NA's with that value?

我有一個數據框,其中某些列只有唯一值或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(.)))

兩者都給出以下錯誤:

探針(.x,.p)中的錯誤:長度(.p)==長度(.x)不正確

有人可以告訴我實現我想要的正確語法是什么嗎?

也許我誤解你的問題,但是這不只是一個物質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

我們可以在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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM