【问题标题】:Reshaping A Data Table in R: Adding Sub Column在 R 中重塑数据表:添加子列
【发布时间】:2021-10-07 20:54:41
【问题描述】:

我有一个如下所示的数据集:

df<-data.frame("Category"=c("A","B","C","D","A","B","C","D"),"Quarter"=c("2021 Q1","2021 Q1","2021 Q1","2021 Q1","2021 Q2","2021 Q2","2021 Q2","2021 Q2"),Variable1=c(1005,2007,1684,1545,4648,5016,4646,5555),Variable2=c(48,500,100,350,357,565,498,600))

我想做的,使用数据,看起来像这样:

我似乎在这里找不到任何类似的问题。我确实看到了可以使用 pivot_longer 函数的替代方法,但这不会给我正在寻找的同一张表。

有人有什么建议吗?这可能与R有关吗?

【问题讨论】:

  • 好吧,一个数据框不能有共享的列名,但如果你只希望它用于显示目的,它应该可以使用其他包。
  • 只做展示,有什么包推荐吗?
  • 查看knitr::kablekableExtra 包。特别是add_header_above 函数。
  • 如果你不想要一个通用的标题而只想重塑你可以使用tidyr::pivot_wider(df, names_from = Quarter, values_from = starts_with('Variable'))

标签: r dataframe dplyr tidyverse reshape


【解决方案1】:

您似乎想重塑您的 data.frame。以下可能是一种选择

reshape(
  df,
  direction = "wide",
  idvar = "Category",
  timevar = "Quarter"
)

给了

  Category Variable1.2021 Q1 Variable2.2021 Q1 Variable1.2021 Q2
1        A              1005                48              4648
2        B              2007               500              5016
3        C              1684               100              4646
4        D              1545               350              5555
  Variable2.2021 Q2
1               357
2               565
3               498
4               600

【讨论】:

    【解决方案2】:

    这是一个解决方案,使用tidyr::pivot_longer()tidyr::pivot_wider() 进行旋转(以添加Thomas 对reshape 的使用),然后使用flextable::flextable() 进行显示。

    请注意,根据您的真实数据集,自动合并标题可能并不容易。

    library(tidyverse)
    library(flextable)
    
    df<-data.frame("Category"=c("A","B","C","D","A","B","C","D"),"Quarter"=c("2021 Q1","2021 Q1","2021 Q1","2021 Q1","2021 Q2","2021 Q2","2021 Q2","2021 Q2"),Variable1=c(1005,2007,1684,1545,4648,5016,4646,5555),Variable2=c(48,500,100,350,357,565,498,600))
    
    #pivoting
    df2 = df %>%
        pivot_longer(starts_with("Variable")) %>% 
        transmute(Category, name=paste(Quarter, "-", name), value) %>% 
        pivot_wider()
    
    
    #Creating the table
    header_df = tibble(col_keys = names(df2),
                       Quarter = c("Category", "2021 Q1", "2021 Q1", "2021 Q2", "2021 Q2"),
                       Variable = c("Category", "Variable 1", "Variable 2", "Variable 1", "Variable 2"))
    df2 %>% 
        flextable() %>% 
        set_header_df(header_df) %>%
        merge_v(part="header") %>% 
        merge_h(part="header") %>% 
        theme_box() %>% 
        align(align = "center", part = "header") %>% 
        autofit()
    

    reprex package (v2.0.0) 于 2021-08-10 创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      • 2014-03-02
      • 1970-01-01
      • 2014-10-10
      相关资源
      最近更新 更多