Как сделать поворот шире в R по значению одного столбца

#r #dplyr #pivot

Вопрос:

Ниже приведены примеры данных и манипуляции, которые я проделал до сих пор. Я пробовал это другими способами, но у меня есть идея, которая может сделать это немного проще. Предполагаемый результат находится внизу. то, что я ищу, — это способ развернуться шире, основываясь на том, когда в столбце smb указано «всего». Существует пять возможных значений для smb.. 1,2,3,4 и всего. Я хочу, чтобы был новый столбец smb.total, в котором будет указана общая сумма для каждой комбинации smb/год/qtr/площадь. Я попытался поместить фильтр перед более широким оператором pivot (внизу).

   library(readxl)
  library(dplyr)
  library(stringr)
  library(tidyverse)
  library(gt)


 employment <- c(1,45,125,130,165,260,600,601,2,46,127,132,167,265,601,602,50,61,110,121,170,305,55,603,52,66,112,123,172,310,604,605)
 small <- c(1,1,2,2,3,4,NA,NA,1,1,2,2,3,4,NA,NA,1,1,2,2,3,4,NA,NA,1,1,2,2,3,4,NA,NA)
 area <-c(001,001,001,001,001,001,001,001,001,001,001,001,001,001,001,001,003,003,003,003,003,003,003,003,003,003,003,003,003,003,003,003)
 year<-c(2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020)
 qtr <-c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2)

 smbtest <- data.frame(employment,small,area,year,qtr)

 smbtest$smb <-0

 smbtest <- smbtest %>% mutate(smb = case_when(employment >=0 amp; employment <100 ~ "1",employment >=0 
 amp; employment <150 ~ "2",employment >=0 amp; employment <250 ~ "3", employment >=0 amp; employment <500 ~ 
"4", employment >=0 amp; employment <100000 ~ "Total"))


smbsummary2<-smbtest %>% 
mutate(period = paste0(year,"q",qtr)) %>%
group_by(area,period,smb) %>%
summarise(employment = sum(employment), worksites = n(), 
        .groups = 'drop_last') %>% 
mutate(employment = cumsum(employment),
     worksites = cumsum(worksites))

smbsummary2<- smbsummary2%>%
group_by(area,smb)%>%
mutate(empprevyear=lag(employment),
     empprevyearpp=employment-empprevyear,
     empprevyearpct=((employment/empprevyear)-1), 
empprevyearpct=scales::percent(empprevyearpct,accuracy = 0.01)
)

 area   period    smb      employment     worksites     smb.Total
   1    2020q1     1          46            2              1927
   1    2020q1     2         301            4              1927
   1    2020q1     3         466            5              1927
   1    2020q1     4         726            6              1927
   1    2020q1    Total     1927            8              1927 

smbsummary2<-smbsummary2 %>%
filter(small=='Total')
pivot_wider(names_from = small, values_from = employment)
 

Ответ №1:

Может быть, этот код решит ваш вопрос:

 employment <- c(1, 45, 125, 130, 165, 260, 600, 601, 2, 46, 127, 
                132, 167, 265, 601, 602, 50, 61, 110, 121, 170, 
                305, 55, 603, 52, 66, 112, 123, 172, 310, 604, 605)
small <- c(1, 1, 2, 2, 3, 4, NA, NA, 1, 1, 2, 2, 3, 4, NA, NA, 1, 1,
           2, 2, 3, 4, NA, NA, 1, 1, 2, 2, 3, 4, NA, NA)
area <-c(001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001,
         001, 001, 001, 001, 003, 003, 003, 003, 003, 003, 003, 003,
         003, 003, 003, 003, 003, 003, 003, 003)
year<-c(2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 
        2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020,
        2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020,
        2020, 2020)
qtr <-c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1,
        1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2)

smbtest <- tibble(employment, small, area, year, qtr)

smbtest$smb <- 0

smbtest <- smbtest %>% 
  mutate(smb = case_when(employment >=0 amp; employment <100 ~ "1",
                         employment >=0 amp; employment <150 ~ "2",
                         employment >=0 amp; employment <250 ~ "3", 
                         employment >=0 amp; employment <500 ~ "4", 
                         employment >=0 amp; employment <100000 ~ "Total"))

smbtest <- smbtest %>% 
  relocate(smb, year, qtr, area, small, employment)

smbsummary2 <- smbtest %>% 
  mutate(period = paste0(year,"q",qtr)) %>%
  group_by(area, period, smb) %>% 
  summarise(employment = sum(employment), 
            worksites = n()) %>% 
  mutate(employment = cumsum(employment),
         worksites = cumsum(worksites))

smbsummary2 %>% 
  group_by(area, period) %>% 
  mutate(`employ/period (%)` = employment/employment[smb == "Total"]*100)
 

Возможно, это не лучший ответ, но для ваших данных, я думаю, он работает хорошо.
Если нет, пожалуйста, скажите мне.

Хорошая работа!

Ответ №2:

Я знаю, правильно ли я понимаю.

Ты хочешь немного.всего чего? переменная занятости? Если да. В вашем объекте «smbsummary2» используйте этот код:

 smbsummary2 <- smbtest %>% 
relocate(smb, year, qtr, area, small, employment) %>% 
group_by(smb, year, qtr, area) %>% 
mutate(smb.total = n())
 

Если бы это было не так, не могли бы вы объяснить мне лучше?

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

1. Стоящая перед нами задача состоит в том, чтобы определить, какова доля общей занятости для каждой категории малого и среднего бизнеса. Таким образом, в первом случае это было бы 46/1927, или 2,38%. Тем не менее, я подумал, что если бы я сделал широкий разворот и поместил общее количество (1927) в виде столбца, то сделать один столбец/второй столбец было бы проще. Имеет ли это смысл?