Мы можем на самом деле сделать это таким образом, который может показаться немного странным, но относительно прямым. Начнем с работы только с кадрами данных a
и b
и давайте немного упростим ситуацию. Предположим, что переменная id
в обоих a
и b
являются следующие:
a_id <- 1:5
b_id <- 1:5
В этом простом примере, a_id
и b_id
точно идентичны. Мы хотим знать, сколько раз каждое из значений в a_id
появляется в b_id
. Мы, очевидно, знаем, что ответ один раз в каждом, но как нам заставить R сказать нам это? Вот где функция table
может пригодиться:
table(a_id, b_id)
# b_id
# a_id 1 2 3 4 5
# 1 1 0 0 0 0
# 2 0 1 0 0 0
# 3 0 0 1 0 0
# 4 0 0 0 1 0
# 5 0 0 0 0 1
Это может выглядеть немного некрасиво, но вы можете видеть, что у нас есть b_id
с на вершине (1-5), и наши a_id
с на левшей сторона. По диагонали мы видим, сколько раз каждое значение a_id
появляется в b_id
, и это 1 каждый, как мы уже знали. Итак, как мы получаем только эту информацию? R имеет хорошую функцию под названием diag
, которая получает главную диагональ для нас:
diag(table(a_id, b_id))
# 1 2 3 4 5
# 1 1 1 1 1
И там у нас есть. Вектор с нашими значениями «countif». Но что, если b_id
не имеет всех значений, которые находятся в a_id
? Если мы попытаемся сделать то, что мы только что сделали, мы получим ошибку, потому что table
не нравится, когда два вектора имеют разную длину. Поэтому мы немного модифицируем его:
a_id <- 1:10
b_id <- 4:8
table(b_id[b_id %in% a_id])
# 4 5 6 7 8
# 1 1 1 1 1
Пара новых вещей здесь. Использование %in%
просто запрашивает R, чтобы сообщить нам, существует ли значение в векторе. Например, 1 %in% 1:3
вернет TRUE
, но 4 %in% 1:3
вернет FALSE
. Затем вы заметите, что мы проиндексировали b_id
, используя [
. Это возвращает только значения b_id
, где b_id %in% a_id
- TRUE
, что в данном случае составляет b_id
.
Так что это выглядит, как если мы ожидаем, что более чем одно значение каждого a_id
в b_id
, но не каждый a_id
значение, чтобы быть в b_id
?Давайте посмотрим на более реальный пример:
a_id <- 1:10
b_id <- sample(3:7, 1000, replace=TRUE)
table(b_id[b_id %in% a_id])
# 3 4 5 6 7
# 210 182 216 177 215
Как я уже сказал, это может показаться немного странным на первый, но это относительно прямо вперед. Надеюсь, это поможет вам больше, чем смущает вас.
Это отличный пример того, почему это плохая идея представить неудачный код; скорее, рекомендуется опубликовать минимальный пример, описывающий цель и ввод и вывод. Обычно можно ожидать, что проблема COUNTIF будет решена с помощью суммы (логического выражения). –