【问题标题】:Converting a long table to a wide table in Excel (or R) [duplicate]在Excel(或R)中将长表转换为宽表[重复]
【发布时间】:2026-01-04 21:25:05
【问题描述】:

我需要将我的长 excel 表转换为如图所示的宽表。

我已经可以在 R 和 Tableau Prep 中执行此操作,但是我希望所有空/空白单元格位于每个类别的末尾。不在顶部。 Excel VBA 可能是我最好的选择。但是我不熟悉 VBA。

我在 R 中获取宽表的代码: data_wide

但是,我没有得到最后的空白单元格。

这是我的 R 数据集:

structure(list(Number = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 
12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26), 
Theme = c("Summer", "Summer", "Summer", "Summer", "Summer", 
"Summer", "Summer", "Summer", "Summer", "Summer", "Summer", 
"Summer", "Summer", "Summer", "Winter", "Winter", "Winter", 
"Winter", "Winter", "Winter", "Fall", "Fall", "Fall", "Fall", 
"Fall", "Fall"), Description = c("A", "B", "C", "D", "E", 
"F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", 
"R", "S", "T", "U", "V", "W", "X", "Y", "Z"), Sector = c("APPLE", 
"APPLE", "APPLE", "ORANGE", "ORANGE", "ORANGE", "ORANGE", 
"ORANGE", "BANANA", "BANANA", "CHERRY", "CHERRY", "CHERRY", 
"APPLE", "APPLE", "ORANGE", "BANANA", "CHERRY", "CHERRY", 
"APPLE", "APPLE", "ORANGE", "ORANGE", "ORANGE", "CHERRY", 
"CHERRY")), row.names = c(NA, -26L), class = c("tbl_df", 
"tbl", "data.frame"))

【问题讨论】:

  • 不幸的是,你可以看到我的有一些宽格式的空白单元格。我需要在每个类别的末尾有空白单元格。简单地在 R 中重塑不会这样做。
  • 请以纯文本形式提供数据,以使该问题可重现。您可以复制/粘贴dput(dataset) 的输出。
  • @neilfws 我用纯文本(来自 R)的数据更新了我的问题。 Mycode : > DATA_STACK View(DATA_STACK) > dput(sTACK_R)

标签: r excel vba


【解决方案1】:

要使spread 工作,您需要进行一些预处理。为每个Sector 创建一个行号变量,删除Number 列,然后删除spread

library(dplyr)

df %>%
  group_by(Sector) %>%
  mutate(row = row_number()) %>%
  select(-Number) %>%
  tidyr::spread(Sector, Description) %>%
  select(-row)

# A tibble: 13 x 5
#   Theme  APPLE BANANA CHERRY ORANGE
#   <chr>  <chr> <chr>  <chr>  <chr> 
# 1 Fall   NA    NA     Y      NA    
# 2 Fall   U     NA     Z      V     
# 3 Fall   NA    NA     NA     W     
# 4 Fall   NA    NA     NA     X     
# 5 Summer A     I      K      D     
# 6 Summer B     J      L      E     
# 7 Summer C     NA     M      F     
# 8 Summer N     NA     NA     G     
# 9 Summer NA    NA     NA     H     
#10 Winter NA    Q      NA     NA    
#11 Winter NA    NA     R      NA    
#12 Winter O     NA     S      NA    
#13 Winter T     NA     NA     P     

或者更短一点的是将Number列本身更改为行索引

df %>%
  group_by(Sector) %>%
  mutate(Number = row_number()) %>%
  tidyr::spread(Sector, Description)

【讨论】:

  • 嗨,看起来这个选项正在工作。您知道如何将 Tibble 更改为数据集以便导出到 Excel 吗?谢谢!
  • @Rohamsk 是的,只需将其分配给变量df1 &lt;-df %&gt;% group_by(Sector) %&gt;% mutate(Number = row_number()) %&gt;% tidyr::spread(Sector, Description) %&gt;% select(-Number),然后使用write.csvwrite.csv(df1, "/path/of/file/temp.csv", row.names = FALSE)