【问题标题】:How to format data from excel containing two rows of column headers to be able to use in R?如何格式化包含两行列标题的excel数据以便能够在R中使用?
【发布时间】:2021-12-29 12:47:07
【问题描述】:

我正在将下表1 导入到 R 中,但在格式化方面遇到了困难,因为每列都有两个标题。我想要的输出是第二张表2。我打算使用 tidyr 来收集数据。

我遇到的另一个障碍是合并的单元格。我一直在使用 fillMergedCells=TRUE 来复制它。

 read.xlsx(xlsxFile ="C:/Users/X/X/Desktop/X.xlsx",fillMergedCells = TRUE)

【问题讨论】:

    标签: r excel


    【解决方案1】:

    一种选择是

    1. 使用选项colNames = FALSE读取您的excel文件
    2. 将前两行粘贴在一起并将结果用作列名。这里我使用下划线作为分隔符,方便以后拆分名称。
    3. 去掉前两行
    4. 使用tidyr::pivot_longer 转换为长格式。
    # df <- openxlsx::read.xlsx(xlsxFile ="data/test2.xlsx", fillMergedCells = TRUE, colNames = FALSE)
    
    # Use first two rows as names
    names(df) <- paste(df[1, ], df[2, ], sep = "_")
    names(df)[1] <- "category"
    # Get rid of first two rows and columns containing year average
    df <- df[-c(1:2), ]
    df <- df[, !grepl("^Year", names(df))]
    
    library(tidyr)
    library(dplyr)
    
    df %>%
      pivot_longer(-category, names_to = c("Time", ".value"), names_pattern = "^(.*?)_(.*)$") %>%
      arrange(Time)
    #> # A tibble: 16 × 4
    #>    category Time   Y     Z    
    #>    <chr>    <chr>  <chr> <chr>
    #>  1 Total    Feb-21 1     1    
    #>  2 A        Feb-21 2     2    
    #>  3 B        Feb-21 3     3    
    #>  4 C        Feb-21 4     4    
    #>  5 D        Feb-21 5     5    
    #>  6 E        Feb-21 6     6    
    #>  7 F        Feb-21 7     7    
    #>  8 G        Feb-21 8     8    
    #>  9 Total    Jan-21 1     1    
    #> 10 A        Jan-21 2     2    
    #> 11 B        Jan-21 3     3    
    #> 12 C        Jan-21 4     4    
    #> 13 D        Jan-21 5     5    
    #> 14 E        Jan-21 6     6    
    #> 15 F        Jan-21 7     7    
    #> 16 G        Jan-21 8     8
    

    数据

    df <- structure(list(X1 = c(
      NA, NA, "Total", "A", "B", "C", "D", "E",
      "F", "G"
    ), X2 = c(
      "Year Rolling Avg.", "Share", NA, "1", "1",
      "1", "1", "1", "1", "1"
    ), X3 = c(
      "Year Rolling Avg.", "Y", "1",
      "2", "3", "4", "5", "6", "7", "8"
    ), X4 = c(
      "Year Rolling Avg.",
      "Z", "1", "2", "3", "4", "5", "6", "7", "8"
    ), X5 = c(
      "Jan-21",
      "Y", "1", "2", "3", "4", "5", "6", "7", "8"
    ), X6 = c(
      "Jan-21",
      "Z", "1", "2", "3", "4", "5", "6", "7", "8"
    ), X7 = c(
      "Feb-21",
      "Y", "1", "2", "3", "4", "5", "6", "7", "8"
    ), X8 = c(
      "Feb-21",
      "Z", "1", "2", "3", "4", "5", "6", "7", "8"
    )), row.names = c(
      NA,
      10L
    ), class = "data.frame")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      • 2018-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-02
      相关资源
      最近更新 更多