如何最好地在 R 中执行此枢轴操作

How best to do this pivot operation in R

以下是样本数据和期望的结果。这是实际数据集的简化版本。在实际的数据集中,有20年4个季度。希望每个唯一的公司条目都列出一次,就业数据系列 运行 从左到右从头到尾。如果 2019 年第 3 季度没有 Vision Inc 的数据,那么我希望它是 return O 而不是 NA。

 library(tidyverse)
 library(dplyr)

 legalname <- c("Vision Inc.","Expedia","Strong Enterprise","Vision Inc.","Expedia","Strong Enterprise")
 year <- c(2019,2019,2019,2019,2019,2019)
 quarter <- c(1,1,1,2,2,2)
 cnty <- c(031,029,027,031,029,027)
 naics <- c(345110,356110,362110,345110,356110,345110)
 mnth1emp <- c (11,13,15,15,17,20)
 mnth2emp <- c(12,14,15,16,18,22)
 mnth3emp <-c(13,15,15,17,21,29)

 employers <- data.frame(legalname,year,quarter,naics,mnth1emp,mnth2emp,mnth3emp)

期望的结果

 legalname       cnty      naics     2019m1      2019m2   2019m3   2019m4   2019m5   2019m6
 Vision Inc        031      345110      11            12      13       15       16        17
 Expedia           029      356110      13            14      15       17       18        21  

这对你有用吗?

第一个透视更长的时间以获得一个季度中的月份和值;然后旋转更宽以获得您想要的宽幅。

employers %>%
  filter(legalname != "Strong Enterprise") %>%
  pivot_longer(mnth1emp:mnth3emp, names_to = "mnth", values_to = "value") %>% 
  mutate(month_in_quarter = as.numeric(str_extract(mnth, "\d")),
         month =str_c("m", month_in_quarter +  3*(quarter - 1)))  %>% 
  select(-c(month_in_quarter, mnth)) %>%
   pivot_wider(c(legalname,cnty, naics), names_from = c(year, month),
              values_from = value,
values_fill = 0)

values_fill 将用 0 填充 NAs。

我先转为长格式,然后按legalnameyear排列(只是为了double-check它们是按数字顺序排列的)。然后,我为每家公司每年创建一个独特的月系列。然后,我放下四分之一并转回宽格式并将名称和年份放在一起,最后将 NA 替换为 0。在这里,我假设您希望每个唯一的 naics 在它自己的行上。

library(tidyverse)

employers %>% 
  pivot_longer(starts_with("mnth")) %>% 
  arrange(legalname, year) %>% 
  group_by(legalname, year, naics) %>% 
  mutate(name = paste0("m", 1:n())) %>% 
  select(-quarter) %>% 
  pivot_wider(names_from = c("year", "name"), names_sep = "", values_from = "value") %>% 
  mutate(across(everything(), ~replace_na(.,0)))

输出

  legalname          naics `2019m1` `2019m2` `2019m3` `2019m4` `2019m5` `2019m6`
  <chr>              <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
1 Expedia           356110       13       14       15       17       18       21
2 Strong Enterprise 362110       15       15       15        0        0        0
3 Strong Enterprise 345110        0        0        0       20       22       29
4 Vision Inc.       345110       11       12       13       15       16       17

也许试试这个。

我找到了一种在 R 中获得正确轴心的方法。我将库(“pivottabler”)与 data.frame“bhmtrains”一起使用。这现在有效了。

library(pivottabler)
qhpvt(bhmtrains, c("=","TOC"), "TrainCategory", 
c("Mean Speed"="mean(SchedSpeedMPH, na.rm=TRUE)", "Std Dev
Speed"="sd(SchedSpeedMPH, na.rm=TRUE)"),
formats=list("%.0f", "%.1f"), totals=list("", "TrainCategory"="All",
"Categories"))

my results out of the code