2016-04-28 4 views
0

У меня есть набор данных «a» с столбцом «id» с примерно 23000 строк, которые уникальны в этой области данных. Я хочу рассчитать частоту появления этих уникальных значений в двух других наборах данных «b» и «c». Чтобы сделать это, я попробовал код:Функция Countif (excel) в R

count1 <- as.data.frame(apply(a,1,function(x)sum(b$id==x[45]))) 
a <- cbind(a,count1) 

, так как «идентификатор» является 45-й столбец в dataframe «Ъ». код работает для подсчета в б, но когда я попробовал один и тот же код для подсчета частоты «ID» в dataframe «с»:

count2 <- as.data.frame(apply(a,1,function(x)sum(c$id==x[17]))) 

«ID» в dataframe «с» находится в 17-м столбце , Частоты всех «id» считаются 0, что не так, как должно быть. Может ли кто-нибудь предложить, где проблема или как решить эту проблему?

+1

Это отличный пример того, почему это плохая идея представить неудачный код; скорее, рекомендуется опубликовать минимальный пример, описывающий цель и ввод и вывод. Обычно можно ожидать, что проблема COUNTIF будет решена с помощью суммы (логического выражения). –

ответ

2

Мы можем на самом деле сделать это таким образом, который может показаться немного странным, но относительно прямым. Начнем с работы только с кадрами данных 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 

Как я уже сказал, это может показаться немного странным на первый, но это относительно прямо вперед. Надеюсь, это поможет вам больше, чем смущает вас.