重命名时旋转更宽

pivot wider while renaming

我有一个table这样的

 id name            value
 1 PROD_N           NA    
 2 PROD_N_NATIONAL  0.789
 3 PROD_N1          0.5    
 4 PROD_N1_NATIONAL 0.2    
 5 PROD_N2          0.4    
 6 PROD_N2_NATIONAL 0.3   
 7 PROD_N3          NA    
 8 PROD_N3_NATIONAL 0.221    
 9 PROD_N4          0.2    
10 PROD_N4_NATIONAL  0.391

我需要类似的东西(为了制作一个带有填充的 gg plot 分组条)。

ID year  prod  prod_national
1 2020   NA    0.789
2 2019   0.5   0.2
3 2018   0.4   0.3
4 2017   NA    0.221
5 2016   0.2   0.391

我几乎可以肯定我应该使用 pivot_wider 但我无法做到这一点。我总是以

结尾
id prod_n prod_n_national prod_n1 prod_n1_national ...

此外,这是另一个问题,但即使有了所需的 table,我也不确定如何在同一张图中绘制两个 'y' 值。但我会看到我什么时候到那里。

感谢任何提示!

我看到在将 table 转换为宽格式之前可能需要处理两个步骤。

  1. year 列必须由 name 列中的数字创建
  2. 必须删除 name 列中的数字。

代码

df  %>% 
  mutate(year = 2020 - replace_na(as.numeric(str_extract(name, "\d")), 0),
         name = str_remove(name, "\d")) %>% 
  pivot_wider(id_cols = year, 
              names_from = name,
              values_from = value) %>% 
  mutate(ID = row_number())

# A tibble: 5 x 4
   year PROD_N PROD_N_NATIONAL    ID
  <dbl>  <dbl>           <dbl> <int>
1  2020   NA             0.789     1
2  2019    0.5           0.2       2
3  2018    0.4           0.3       3
4  2017   NA             0.221     4
5  2016    0.2           0.39      5

数据

df <- structure(list(id = 1:10, name = structure(1:10, .Label = c("PROD_N", 
"PROD_N_NATIONAL", "PROD_N1", "PROD_N1_NATIONAL", "PROD_N2", 
"PROD_N2_NATIONAL", "PROD_N3", "PROD_N3_NATIONAL", "PROD_N4", 
"PROD_N4_NATIONAL"), class = "factor"), value = c(NA, 0.789, 
0.5, 0.2, 0.4, 0.3, NA, 0.221, 0.2, 0.39)), class = "data.frame", row.names = c(NA, 
-10L))

情节

在 ggplot 中绘制两个 y 变量 取决于您需要哪种绘图。

如果你需要两个不同的 geom_x 你可以这样做:

ggplot(df_wide) +
  geom_line(aes(y = PROD_N, x = year)) +
  geom_point(aes(y = PROD_N_NATIONAL, x = year))

如果您想要相同的 geom_x 但名称颜色不同,那么您可能需要长格式:

df  %>% 
  mutate(year = 2020 - replace_na(as.numeric(str_extract(name, "\d")), 0),
         name = str_remove(name, "\d")) %>%
  ggplot() +
  geom_line(aes(y = value, x = year, color = name))