【问题标题】:pivot wider while renaming重命名时枢轴更宽
【发布时间】:2021-03-07 15:01:22
【问题描述】:

我有一张这样的桌子

 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 图分组条)。

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 ...

另外,这是另一个问题,但即使使用所需的表格,我也不确定如何在同一个图表中绘制两个“y”值。不过我会看看我什么时候到。

感谢任何提示!

【问题讨论】:

    标签: r tidyr


    【解决方案1】:

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

    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)) 
    

    【讨论】:

    • 谢谢,我刚试过,但很奇怪,我的 'prod_N' 和 'prod_n_national' 现在是一个列表。你知道为什么吗?
    • 嘿只是为了记录,感谢这个链接stackoverflow.com/questions/57937949/…我明白如何“取消”列表从轴到宽
    猜你喜欢
    • 2022-01-22
    • 2021-10-25
    • 2020-01-16
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    相关资源
    最近更新 更多