在 R 中用 two-line headers 读取 excel

Read excel with two-line headers in R

我有一个 excel 文件,结构简单,如下图所示。

        A                       B       
a       b       c       a       b        c
0.42    0.42    0.42    0.42    0.42    0.42
0.42    0.42    0.42    0.42    0.42    0.42

如何在 R 中获取 data.frame,如下所示?

col_name    a       b       c
A           0.42    0.42    0.42
A           0.42    0.42    0.42
B           0.42    0.42    0.42
B           0.42    0.42    0.42

一个重要的补充。示例结构 - 只是整体 table 的一部分。

整个 excel 看起来像:

只要Excel文件小,我就这样处理。

library(readxl)
library(zoo)
library(tidyr)
library(dplyr)
library(reshape2)

cols <- read_excel("path_to_file.xlsx", 
                   col_names = FALSE)[1:2, ]

cols[1, ] <- na.locf(as.character(cols[1, ]),
                     na.rm = FALSE)

cols <- vapply(X = cols,
               FUN = function(x) if (is.na(x[1])) x[2] else paste0(x, collapse = "_"),
               FUN.VALUE = character(1))

DFrame <- read_excel("path_to_file.xlsx", 
                     col_names = FALSE,
                     skip = 2) %>%
  setNames(cols) %>%
  mutate(row_id = row_number())

DFrame

DFrame %>%
  select(row_id, A_a:B_c) %>%
  gather(column, value, A_a:B_c) %>%
  mutate(AB_group = sub("(^[A-B])_.+$", "\1", column),
         column = sub("^[A-B]_", "", column)) %>%
  dcast(row_id + AB_group ~ column, 
        value.var = "value")

缺点是,由于 read_excel 没有 nrows 参数,此代码实际上读取文件两次。还有其他包可以读取 excel 个文件,例如 gdata::read.xls 可以让您只读取前两行以获取列名。我认为那个包有更多的开销。

无论如何,当我遇到这种情况时,我要么单独导入列名并在将它们分配给数据之前将它们操作成我想要的,要么我根本不读入名称并手动重置所有使用 setNames.

的变量名