#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
- База R :
subset(data, ave(n == 1 amp; code == 'ABC', id, FUN = all))
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