![](/img/trans.png)
[英]How can I fill in NA values based on the next real value but divide that value between the preceding NAs?
[英]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.