簡體   English   中英

如何在數據框中組合兩個觀察結果並用相互矛盾的條目填充 NA

[英]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.

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