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

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

我正在寻找一种方法来删除所有跨变量的值不匹配的行,除非缺少匹配是由于其中一个(或多个)值为NA。

  1. df <- data.frame(uid = c(1, 2, 3, 4, 5, 6, 7),
  2. x1 = c('a', NA, NA, 'a', 'a', 'c', 'b'),
  3. x2 = c(NA, 'b', NA, NA, NA, NA, 'b'),
  4. x3 = c(NA, NA, 'c', 'a', 'b', NA, 'b'),
  5. x4 = c(NA, NA, NA, NA, NA, NA, 'b'),
  6. x5 = c(NA, NA, NA, NA, NA, 'b', 'b'))
  7. df
  8. uid x1 x2 x3 x4 x5
  9. 1 1 a <NA> <NA> <NA> <NA>
  10. 2 2 <NA> b <NA> <NA> <NA>
  11. 3 3 <NA> <NA> c <NA> <NA>
  12. 4 4 a <NA> a <NA> <NA>
  13. 5 5 a <NA> b <NA> <NA>
  14. 6 6 c <NA> <NA> <NA> b
  15. 7 7 b b b b b

我正在寻找的是一个可以删除第5行和第6行的方法。我尝试了几种使用subset的方法,如果我这样做的话,我能够让它工作:

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

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

lrpiutwd

lrpiutwd1#

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

图书馆

  1. library(dplyr)
  2. library(stringr)

数据

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

代码

  1. remove_rows <- function(string){
  2. if(sum(is.na(string)) >= (length(string) -1)){
  3. TRUE
  4. }else{
  5. string %>%
  6. na.omit() %>%
  7. str_c(.,collapse = "") %>%
  8. str_count(string) %>%
  9. max(na.rm = TRUE) > 1
  10. }
  11. }
  12. df %>%
  13. rowwise() %>%
  14. filter(remove_rows(c_across(x1:x5)))

输出

  1. # A tibble: 5 x 6
  2. # Rowwise:
  3. uid x1 x2 x3 x4 x5
  4. <dbl> <chr> <chr> <chr> <chr> <chr>
  5. 1 1 a NA NA NA NA
  6. 2 2 NA b NA NA NA
  7. 3 3 NA NA c NA NA
  8. 4 4 a NA a NA NA
  9. 5 7 b b b b b
展开查看全部
o2gm4chl

o2gm4chl2#

删除感兴趣列中唯一非NA值的数量超过1的行:

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

相关问题