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