我想组合类似的观测值,使观测A中的NA
s被观测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()