R语言 删除特定列中值不匹配的所有行,除非其他值为NA

cu6pst1q  于 2022-12-20  发布在  其他
关注(0)|答案(2)|浏览(160)

我正在寻找一种方法来删除所有跨变量的值不匹配的行,除非缺少匹配是由于其中一个(或多个)值为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的方法,如果我这样做的话,我能够让它工作:

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

但是,我找不到一种方法不需要输入每个组合,这对于只有5列的情况来说已经不切实际了,但是对于实际的数据集来说,这根本不切实际。

lrpiutwd

lrpiutwd1#

不是最干净的解决方案,但我做了一个函数,达到了结果。

图书馆

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
o2gm4chl

o2gm4chl2#

删除感兴趣列中唯一非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

相关问题