Подсчет количества раз, когда значение происходит группировка по id в R - PullRequest
2 голосов
/ 24 октября 2019

У меня есть набор данных, похожий на приведенный ниже в R: Найдено похожих сообщений, подобных этому Подсчет количества раз, когда значение встречается , но не совсем то же самое.

id <-     c(1,1,1, 2,2,2, 3,3,3,3)
cat.1 <-  c("a","a","a","b","b","b","c","c","c","c")
cat.2 <-  c("m","m","m","f","f","f","m","m","m","m")
score <-    c(-1,0,-1, 1,0,1, -1,0,1,1)


data <- data.frame("id"=id, "cat.1"=cat.1, "cat.2"=cat.2, "score"=score)
data
   id cat.1 cat.2 score
1   1     a     m    -1
2   1     a     m     0
3   1     a     m    -1
4   2     b     f     1
5   2     b     f     0
6   2     b     f     1
7   3     c     m    -1
8   3     c     m     0
9   3     c     m     1
10  3     c     m     1

Я быхотел бы подсчитать количество -1 значений в переменной score внутри каждого идентификатора. Также я хотел бы сохранить переменные cat.1 и cat.2. Желаемый результат будет:

   id cat.1 cat.2 count(-1)
1   1     a     m    2
2   2     b     f    0
3   3     c     m    1

Есть ли у вас какие-либо предложения? Спасибо!

Ответы [ 4 ]

5 голосов
/ 24 октября 2019

Это то, что мы можем использовать dplyr для:

data %>%
    group_by(id, cat.1, cat.2) %>% # or: group_by_at(vars(-score))
    summarise(count_neg_1 = sum(score == -1))


#      id cat.1 cat.2 count_neg_1
# 1     1 a     m               2
# 2     2 b     f               0
# 3     3 c     m               1

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

4 голосов
/ 24 октября 2019
library(data.table)
setDT(data)[ , sum(score == -1), by=c('id', 'cat.1', 'cat.2')]
#    id cat.1 cat.2 V1
# 1:  1     a     m  2
# 2:  2     b     f  0
# 3:  3     c     m  1
4 голосов
/ 24 октября 2019

Одна base R возможность может быть:

aggregate(score ~ ., FUN = function(x) sum(x == -1), data = data)

  id cat.1 cat.2 score
1  2     b     f     0
2  1     a     m     2
3  3     c     m     1

Если у вас есть больше переменных в ваших данных, и вы хотите сгруппировать только с этими тремя, то вы можете явно указать это как aggregate(score ~ id + cat.1 + cat.2, ...)

0 голосов
/ 25 октября 2019

Другой вариант - count

library(dplyr)
data %>%
   mutate(score = score == -1) %>% 
   dplyr::count(id, cat.1, cat.2, wt = score)
# A tibble: 3 x 4
#    id cat.1 cat.2     n
#   <dbl> <fct> <fct> <int>
#1     1 a     m         2
#2     2 b     f         0
#3     3 c     m         1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...