Группировка столбцов для подсчета в R dataframe

#r #dataframe #dplyr

#r #dataframe #dplyr

Вопрос:

Итак, у меня всего 4 разных столбца в dataframe

      port            ip                service      numberOfTimes
1     22         11.11.79.100            ssh           16
2     80         11.11.79.100            www           19
3     111        11.13.79.110            ipw           21
4     123        11.13.79.110            ssh           50
5     22         64.50.80.140            cde           45
6     80         64.50.80.140            www           16
7     22         71.11.64.100            ssh           234
8     80         71.11.64.100            you           33
9     22         100.15.31.1             ssh           99
10    41         120.15.31.12            has           19
 

Итак, у меня следующий вопрос:

Можно ли сгруппировать с помощью r до следующего, чтобы это могло стать чем-то подобным?

После

 port       ip(count of same ip)   service     numberOfTimes
 22             4                  ssh         399 (#1 #5 #7 #9)
 80             3                  www         68 (#2 #6 #8)
 

и так далее, и так для остальных портов

Комментарии:

1. Вы уже отметили dplyr , поэтому я предполагаю, что вы сталкивались group_by() с summarize() функциями and . Предпринимали ли вы какие-либо попытки решить эту проблему самостоятельно? Какой код вы написали и где именно вы застряли?

2. Привет @MrFlick, если честно. Я застрял, действительно застрял. Я хотел попробовать dt<- dt%>% group_by(порт, сервис) %>% summarise(numberOfTimes=sum(numberOfTimes)), но это не сработало. Произошла ошибка невозможно изменить группирующую переменную. Но опять же, даже если я обобщу их вместе, что произойдет с IP-адресами, которые связаны с каждой строкой? Я действительно застрял в том, как начать. потому что каждая строка кажется зависимой от другой

Ответ №1:

Использование dplyr , это довольно просто:

 testData %>%
  group_by(port, service) %>%
  summarise(`Number of IPs` = n_distinct(ip)
            , `Total number of times` = sum(numberOfTimes))
 

Что для образца данных, которые вы включили, дает:

    port service `Number of IPs` `Total number of times`
  <int>   <chr>           <int>                   <int>
1    22     cde               1                      45
2    22     ssh               3                     349
3    41     has               1                      19
4    80     www               2                      35
5    80     you               1                      33
6   111     ipw               1                      21
7   123     ssh               1                      50
 

Если вы получаете какую-то ошибку (упомянутую в комментарии), вам нужно будет предоставить данные, которые на самом деле вызывают эту ошибку, прежде чем люди смогут вам помочь.

Комментарии:

1. О! Я совершенно забыл о функции unique и length для dplyr, большое вам спасибо за помощь, и да, извините за это.

2. Рад, что это сработало для вас. Однако unique ни то, ни length другое не являются dplyr таковыми.

3. Вы также можете использовать n_distinct(ip) , это должно быть быстрее, чем length(unique(ip)) .

4. Я всегда думал, что они из пакета, lol. Думаю, мне тоже есть чему поучиться, спасибо за ваш вклад @MarkPeterson

5. Спасибо @Scarabee — я этим не пользовался, и я делаю такой подсчет. Большая помощь.