Например, у меня есть три столбца: столбец ID, столбец посещений, столбец наркотиков. Столбец «Препарат» содержит символьные значения A, B, C и D. Проблема в том, что каждый идентификатор содержит только A, B, C или D ИЛИ комбинацию A и B.
ID Visit Drug
1 1 A
1 2 B
1 3 A
2 1 B
2 2 B
3 1 C
3 2 C
Итак, если я хочу отфильтровать идентификатор, содержащий ТОЛЬКО лекарство B (у него не может быть одновременно A и B), как мне отфильтровать это? Сверху мне нужен только ID 2, но НЕ ID 1, потому что ID 1 имеет как A, так и B.
Я пробовал этот код, но он дает неверный результат
df %>%
group_by(id) %>%
filter(drug == "B" | drug != "A" & drug != "B" )
Любая помощь будет оценена по достоинству!
В этом случае вы должны указать условие для всего вектора Drug
, как в случае с all
в следующем:
df %>% group_by(ID) %>% filter(all(Drug == "B"))
# A tibble: 2 x 3
# Groups: ID [1]
# ID Visit Drug
# <int> <int> <fct>
# 1 2 1 B
# 2 2 2 B
Вы имеете в виду, как в вашем примере получить ID
равным 1? В любом случае all(drug_code == "A" & drug_code == "B")
никогда ничего не вернет. Возьмите df$Drug[1:3]
и посмотрите, что произойдет: df$Drug[1:3] == "A" & df$Drug[1:3] == "B"
будет искать (векторизованным образом) свои элементы, которые одновременно являются "A"
и "B"
, что невозможно. В данном случае вам нужен df %>% group_by(ID) %>% filter(all(c("A", "B") %in% Drug))
, означающий, что и "A"
, и "B"
существуют где-то в Drug
.
Я предлагаю взять df$Drug
и попробовать any
, all
, ==
, !=
, x %in% y
, y %in% x
, чтобы получить хорошее представление о том, что происходит.
Большое спасибо! Это действительно помогло !! Я изучу те, что указаны выше :)
Возможно, я ошибаюсь, но я считаю, что c («A», «B») внутри all (c («A», «B»)% в% Drug даст идентификаторы с '«либо» A или B, что немного отличается от фильтрации идентификаторов как с A, так и с B
Он сохранит те ID
, которые содержат "A"
хотя бы один раз и "B"
хотя бы один раз, давая только ID == 1
. Если ноль вхождений тоже нормально, но элементами Drug
могут быть только "A"
или "B"
, тогда вы должны использовать df %>% group_by(ID) %>% filter(all(Drug %in% c("A", "B")))
, задав ID
как 1 и 2. (Это означает, что %in%
не симметричен).
Рад помочь. Думаю, теперь ответ можно принять.
Если я хочу отфильтровать как A, так и B, то могу ли я сделать то же самое? ... filter (all (drug_code == "A" & drug_code == "B")) дает мне 0 наблюдений