簡體   English   中英

刪除值在特定列中不匹配的任何行,除非其他值是 NA

[英]Remove any rows where values don't match across specific columns, except if other value(s) is NA

我正在尋找一種方法來刪除每個變量的值不匹配的任何行,除非缺少匹配是由於其中一個(或多個)值是 NA。

df <- data.frame(uid = c(1, 2, 3, 4, 5, 6, 7),
                  x1 = c('a', NA, NA, 'a', 'a', 'c', 'b'),
                  x2 = c(NA, 'b', NA, NA, NA, NA, 'b'),
                  x3 = c(NA, NA, 'c', 'a', 'b', NA, 'b'),
                  x4 = c(NA, NA, NA, NA, NA, NA, 'b'),
                  x5 = c(NA, NA, NA, NA, NA, 'b', 'b'))

df
  uid   x1   x2   x3   x4   x5
1   1    a <NA> <NA> <NA> <NA>
2   2 <NA>    b <NA> <NA> <NA>
3   3 <NA> <NA>    c <NA> <NA>
4   4    a <NA>    a <NA> <NA>
5   5    a <NA>    b <NA> <NA>
6   6    c <NA> <NA> <NA>    b
7   7    b    b    b    b    b

我正在尋找的是一種可以刪除第 5 行和第 6 行的方法。我嘗試了幾種使用子集的方法,如果我這樣做了,就能夠讓它工作:

subset(df, (x1 == x2 | is.na(x1) | is.na(x2)) & ...
           (x4 == x5 | is.na(x4) | is.na(x5)))

但是,我找不到一種不涉及輸入每個組合的方法,這對於只有 5 列的情況已經不切實際,但考慮到實際數據集根本不切實際。

不是最干凈的解決方案,但我做了一個實現結果的函數。

圖書館

library(dplyr)
library(stringr)

數據

df <- data.frame(uid = c(1, 2, 3, 4, 5, 6, 7),
                 x1 = c('a', NA, NA, 'a', 'a', 'c', 'b'),
                 x2 = c(NA, 'b', NA, NA, NA, NA, 'b'),
                 x3 = c(NA, NA, 'c', 'a', 'b', NA, 'b'),
                 x4 = c(NA, NA, NA, NA, NA, NA, 'b'),
                 x5 = c(NA, NA, NA, NA, NA, 'b', 'b'))

代碼

remove_rows <- function(string){
  
  if(sum(is.na(string)) >= (length(string) -1)){
    TRUE
  }else{
    string %>% 
      na.omit() %>% 
      str_c(.,collapse = "") %>% 
      str_count(string) %>% 
      max(na.rm = TRUE) > 1
  }

}

df %>% 
  rowwise() %>% 
  filter(remove_rows(c_across(x1:x5)))

輸出

# A tibble: 5 x 6
# Rowwise: 
    uid x1    x2    x3    x4    x5   
  <dbl> <chr> <chr> <chr> <chr> <chr>
1     1 a     NA    NA    NA    NA   
2     2 NA    b     NA    NA    NA   
3     3 NA    NA    c     NA    NA   
4     4 a     NA    a     NA    NA   
5     7 b     b     b     b     b 

刪除感興趣的列中唯一的非 NA 值的數量超過 1 的行:

df[ ! apply(df[-1], 1, function(x) length(unique(na.omit(x))) ) >1, ]
#--------------------
  uid   x1   x2   x3   x4   x5
1   1    a <NA> <NA> <NA> <NA>
2   2 <NA>    b <NA> <NA> <NA>
3   3 <NA> <NA>    c <NA> <NA>
4   4    a <NA>    a <NA> <NA>
7   7    b    b    b    b    b

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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