在R中导入,包含3行的列标题。将遗漏替换为最新的非遗漏列

时间:2018-01-06 02:51:22

标签: r readxl

我需要帮助导入数据,其中我的列标题分为3行,并隐含了一些标题名称。这是我的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行和第1行中的标题。 2.另外一个挑战是暗示了一些标题。如果标题为空,我希望它使用左侧列中的单元格。我想要导入的一个例子。

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行和第1行。 2然后根据已知位置重命名列。但是,我希望代码存在,这将阻止我这一步。谢谢!!

1 个答案:

答案 0 :(得分:1)

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

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

棘手的部分是标题。这个功能应该这样做:

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