在 R 中导入 3 行的第 headers 列。用最新的 non-missing 列替换缺失的

Import in R with column headers across 3 rows. Replace missing with latest non-missing column

我需要帮助导入数据,其中我的列 header 分为 3 行,隐含了一些 header 名称。这是我的 xlsx 文件的样子

1                         USA                             China
2                         Dollars         Volume          Dollars           Volume
3  Category   Brand       CY2016  CY2017  CY2016  CY2017  CY2016   CY_2017  CY2016   CY2017
4  Chocolate  Snickers    100     120     15      18      100      80       20       22
5  Chocolate  Twix        70      80      8       10      75       50       55       20

我想将数据导入 R,除了我想保留第 1 行和第 2 行中的 header。另一个挑战是隐含了一些 header。如果 header 为空白,我希望它使用左侧列中的单元格。我希望它导入的示例。

1  Category   Brand       USA_Dollars_CY2016  USA_Dollars_CY2017  USA_Volume_CY2016  USA_Volume_CY2017  China_Dollars_CY2016   China_Dollars_CY_2017  China_Volume_CY2016   China_Volume_CY2017
2  Chocolate  Snickers    100                 120                 15                 18                 100                    80                     20                    22
3  Chocolate  Twix        70                  80                  8                  10                 75                     50                     55                    20

我目前的方法是导入,跳过第 1 行和第 2 行,然后根据已知位置重命名列。但是,我希望存在可以阻止我执行此步骤的代码。谢谢!!

我假设您已经将 xlsx 数据保存为 .csv 格式,因此可以这样读取:

header <- read.csv("data.csv", header=F, colClasses="character", nrow=3)
dat <- read.csv("data.csv", header=F, skip=3)

棘手的部分是 header。这个函数应该做到:

construct_colnames <- function(header) {
    f <- function(x) {
        x <- as.character(x)
        c("", x[!is.na(x) & x != ""])[cumsum(!is.na(x) & x != "") + 1]
    }
    res <- apply(header, 1, f)
    res <- apply(res, 1, paste0, collapse="_")
    sub("^_*", "", res)
}
colnames(dat) <- construct_colnames(header)
dat

结果:

   Category    Brand USA_Dollars_CY2016 USA_Dollars_CY2017 USA_Volume_CY2016 USA_Volume_CY2017 China_Dollars_CY2016
1 Chocolate Snickers                100                120                15                18                  100
2 Chocolate     Twix                 70                 80                 8                10                   75
  China_Dollars_CY_2017 China_Volume_CY2016 China_Volume_CY2017
1                    80                  20                  22
2                    50                  55                  20