[英]How to combine two observations in a data frame and fill NAs with contradicting entries
我想結合類似的觀察,使得觀察 A 中的NA
充滿觀察 B 中的條目。如果觀察 A 和觀察 B 有矛盾的條目,例如,同一字段中有兩個不同的值,我想要結果數據幀以在該字段中返回NA
。
例子。
考慮以下數據框
df1 <- data.frame(APPLIANT = c("tom", "tom"),
PERMIT = c(31, 31),
ISSUED_YR = c("2018", NA),
TRANSFERED = c("Y", "N"))
看起來像
APPLIANT PERMIT ISSUED_YR TRANSFERED
1 tom 31 2018 Y
2 tom 31 <NA> N
我希望我的最終數據框看起來像
APPLIANT PERMIT ISSUED_YR TRANSFERED
1 tom 31 2018 NA
我正在考慮使用應用功能。 也許像
apply(df1, 2, FUN = function(one_col){
if(length(unique(one_col)) == 1){one_col}else{ one_col[!is.na(one_col)]}
})
但我不確定如何以優雅的方式處理“矛盾”的數據點......我也不覺得我的解決方案一開始就那么優雅。 如果有更簡單的東西,那將是理想的!
如果只涉及兩個觀察,這可能會有所幫助:
library(dplyr)
df1 %>%
mutate(across(everything(), ~ case_when(
length(unique(.x)) > 1 & !any(is.na(.x)) ~ NA_character_,
TRUE ~ as.character(coalesce(.x, .x[!is.na(.x)]))
))) %>%
distinct()
APPLIANT PERMIT ISSUED_YR TRANSFERED
1 tom 31 2018 <NA>
如果列中有 1 個以上的唯一值,則返回NA
否則返回非 NA 值。
library(dplyr)
df1 %>%
group_by(APPLIANT) %>%
summarise(across(.fns = ~if(n_distinct(., na.rm = TRUE) > 1) NA else na.omit(.)[1]))
#APPLIANT PERMIT ISSUED_YR TRANSFERED
# <chr> <dbl> <chr> <lgl>
#1 tom 31 2018 NA
出於某種原因,上述建議適用於我的示例數據,但不適用於實際數據。 在我的真實數據集中,我有一些是日期對象的列,也許這造成了問題
似乎對我有用但不那么“漂亮”的是以下內容
df %>%
mutate_all(funs(if(length(unique(.)) == 1){
unique(.)
}else{
if(any(is.na(.))){
(.)[!is.na(.)]
}else{
NA
}
})) %>%
distinct()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.