r语言 - 如何在一个数据框中组合两个观测值,并用相互矛盾的条目填充NAs



我想组合类似的观测值,使观测A中的NAs被观测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函数。比如

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()

最新更新