Как создать подсчеты по группам в длинном формате с помощью dplyr

#r #dataframe #dplyr #grouping

#r #фрейм данных #dplyr #группировка

Вопрос:

Я хотел бы сгенерировать таблицы подсчетов в длинном формате из фрейма данных, организованного группами, определенными столбцами в R. Я бы хотел что-то, что реплицирует .groupby в pandas. Я уверен, что dplyr может это сделать, но я не могу найти правильный синтаксис именно для того, что я хочу.

 # Test data
Samples <- c('A01', 'A02', 'A03', 'A04', 'A05', 'A06', 'A07', 'A08', 'A09', 'A10', 'A11', 'A12', 'A13', 'A14', 'A15', 'A16', 'A17', 'A18', 'A19', 'A20')
Group <- c(1, 1, 3, 2, 1, 3, 2, 2, 1, 1, 1, 2, 2, 1, 3, 1, 1, 3, 1, 2)
Country <- c('Thailand', 'Vietnam', 'Cambodia', 'Vietnam', 'Cambodia', 'Thailand', 'Laos', 'Vietnam', 'Vietnam', 'Vietnam', 'Laos', 'Cambodia', 'Vietnam', 'Cambodia', 'Cambodia', 'Laos', 'Laos', 'Cambodia', 'Cambodia', 'Vietnam')
Year <- c(2012, 2018, 2012, 2018, 2018, 2012, 2018, 2018, 2018, 2012, 2018, 2018, 2018, 2012, 2012, 2018, 2018, 2012, 2018, 2012)
df = data.frame(Samples, Group, Country, Year, row.names=c(1))
df
  

И я хотел бы создавать подобные результаты, группируя по «Группе» с подсчетами для каждой страны или года:

 # Desired output 1 - country counts
Group_name <- c(1, 1, 1, 1, 2, 2, 2, 3, 3)
Countries_bygroup <- c('Cambodia', 'Laos', 'Thailand', 'Vietnam', 'Cambodia', 'Laos', 'Vietnam', 'Cambodia', 'Thailand')
Country_counts <- c(3, 3, 1, 3, 1, 1, 4, 3, 1)   
group_by_country = data.frame(Group_name, Countries_bygroup, Country_counts)
group_by_country

# Desired output 2 - Year counts
Group_name2 <- c(1, 1, 2, 2, 3)
Years_bygroup <- c(2012, 2018, 2012, 2018, 2012)
Year_counts <- c(3, 7, 1, 5, 4)
group_by_year = data.frame(Group_name2, Years_bygroup, Year_counts)
group_by_year
  

Конечным результатом является то, что я хочу создавать графики, подобные этим:

 # Plot by country
library('ggplot2')
plot <- ggplot(group_by_country, aes(x = Group_name, y = Country_counts, fill = Countries_bygroup))   
  geom_bar(position = "fill",stat = "identity")  
  scale_y_continuous(labels = percent_format())  
  xlab("Sample group")  
  ylab("")
plot
  

Примерный график

Спасибо за помощь.

Ответ №1:

Мы можем использовать count функцию из dplyr . Нет необходимости в group_by столбцах, поскольку count функция может автоматически позаботиться о группировке. Просто поместите столбцы, которые вы хотите посчитать, в функцию.

 library(dplyr)

df %>% count(Group, Country)
# # A tibble: 9 x 3
#   Group Country      n
#   <dbl> <fct>    <int>
# 1     1 Cambodia     3
# 2     1 Laos         3
# 3     1 Thailand     1
# 4     1 Vietnam      3
# 5     2 Cambodia     1
# 6     2 Laos         1
# 7     2 Vietnam      4
# 8     3 Cambodia     3
# 9     3 Thailand     1

df %>% count(Group, Year)
# # A tibble: 5 x 3
#   Group  Year     n
#   <dbl> <dbl> <int>
# 1     1  2012     3
# 2     1  2018     7
# 3     2  2012     1
# 4     2  2018     5
# 5     3  2012     4
  

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

1. Я получаю сообщение об ошибке: «Ошибка: wt_var должна быть единственной переменной»

2. Не уверен, что это wt_var . Пожалуйста, убедитесь, что мой код работает для вашего примера фрейма данных, а затем попытайтесь выяснить, в чем разница между вашим примером фрейма данных и вашим фреймом данных реального мира.

3. Я получаю это сообщение, используя данные примера

4. @WillHamilton Но я этого не сделал. Повторно запустите консоль R, чтобы посмотреть, поможет ли это.

5. Попробуйте использовать dplyr::count . Я предполагаю, что у вас есть другая функция с именем, count которая маскирует dplyr версию