Поиск отсутствующего соответствия в двух столбцах фрейма данных в R

#r #dataframe #matching

Вопрос:

Я получил:

 a <- c('A','A','B','B','C','C','D','D')
b <- c(1,2,1,2,2,3,1,2)
frame1 <- data.frame(a,b)
 

И теперь я хочу знать, в какой строке в столбце » a «нет числа, соответствующего» 1 «в столбце «b».
В этом случае это будет «С».

Ответ №1:

Вот базовый вариант R —

 with(frame1, setdiff(unique(a), a[b == 1]))
#[1] "C"
 

Извлеките a значения, где b = 1 и используйте setdiff для возврата a значений, которых в них нет.

Ответ №2:

основание R

 frame1[ave(frame1$b, frame1$a, FUN = function(z) !1 %in% z) > 0,]
#   a b
# 5 C 2
# 6 C 3
 

dplyr

 library(dplyr)
frame1 %>%
  group_by(a) %>%
  filter(!1 %in% b)
# # A tibble: 2 x 2
# # Groups:   a [1]
#   a         b
#   <chr> <dbl>
# 1 C         2
# 2 C         3
 

Комментарии:

1. Акцент на обобщении по группам, но я не обратил на это внимания.

Ответ №3:

Мы можем использовать data.table

 library(data.table)
setDT(frame1)[, .SD[!any(b %in% 1)], a]
   a b
1: C 2
2: C 3
 

Или в base R

 unique(subset(frame1, !a %in% a[b == 1])$a)
[1] "C"