R поиск записей без дубликатов в данных длинной формы

#r

#r

Вопрос:

Данные хранятся в длинной форме следующим образом:

 data <- data.table::data.table(id = c(1,1,2,3,3,4), n = c("1","2","1","1","2","1"), code = c("ABC", "ABC", "ABC", "ABC", "DEF", "GHI"))

   id n code
1:  1 1  ABC
2:  1 2  ABC
3:  2 1  ABC
4:  3 1  ABC
5:  3 2  DEF
6:  4 1  GHI
  

Каков самый быстрый метод, с помощью которого можно найти все идентификаторы, где n = 1 и code = ABC, но только если у этого идентификатора нет дополнительных записей.

В приведенной выше таблице данных запрос должен возвращать только id = 2, потому что это единственная строка, которая соответствует вышеуказанным критериям.

Ответ №1:

Вот способы сделать это :

1. data.table

 library(data.table)
setDT(data)[, .SD[all(n == 1 amp; code == 'ABC')], id]
#   id n code
#1:  2 1  ABC
  
  1. База R :
 subset(data, ave(n == 1 amp; code == 'ABC', id, FUN = all))
  
  1. dplyr :
 library(dplyr)
data %>% group_by(id) %>% filter(all(n == 1 amp; code == 'ABC'))
  

Логика всех трех одинакова, она выбирает id строки, в которых есть все значения n == 1 amp; code == 'ABC' (что означает, что нет другого значения, кроме этого). Если вас интересуют только id ‘ы, вы могли бы извлечь уникальные id ‘ы из приведенного выше вывода.

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

1. Где именно это исключает id записи, которые также имеют n==1 и code == "ABC" , но также имеют другие записи под тем же id ?

2. В all . Если в an есть какие-либо значения, id которые имеют n != 1 Или code != 'ABC' , all вернутся FALSE , и эти id значения будут исключены.

3. Я понимаю, спасибо! Выглядит великолепно! Я ценю различные варианты.

Ответ №2:

Я бы подошел к вашей проблеме, сначала определив уникальные идентификаторы в вашей таблице. Для них я бы создал логический тест, подобный приведенному ниже, для фильтрации ваших данных:

 freq <- table(data$id)

unique_ids <- as.integer(names(freq[freq == 1]))

test <- data$id %in% unique_ids amp; data$n == 1 amp; data$code == "ABC"

select_data <- data[test, ]
  

В результате этого:

    id n code
1:  2 1  ABC