【问题标题】:Importing and Tidying from Terrible Excel Spreadsheet in R从 R 中糟糕的 Excel 电子表格导入和整理
【发布时间】:2018-02-17 16:33:58
【问题描述】:

首先,请参阅this url,了解我正在格式化的数据类型的一个小示例。您会注意到我在工作表中突出显示了我要选择的两个区域。随着项目进出数据集,选择范围需要是动态的。对于第一部分,我认为这段代码就足够了:

library(tidyverse)
library(readxl)

filename <- "MyDataset.xlsx"

#obtain first section of my excel spreadsheet
project_codes <- read_excel(
  path = filename,
  sheet = "Jan18",
  range = "A10:B1000",
  col_names = c("proj_num", "name")
) %>% 
  drop_na() %>% 
  filter(grepl("-", project_codes$proj_num))

第二部分是我被绊倒的地方...我想确保在电子表格的另一个突出显示区域中选择的行子集与我的“project_codes”完全相同。

我有许多以完全相同的方式格式化的工作表(并且命名约定是一致的 - Jan18、Feb18、Mar18),所以如果有人可以在解决第 1 部分后帮助我遍历工作表,则可以加分。

【问题讨论】:

  • 假设我们从第 6 行向下捕获,是您想要在标题下的每张表中捕获的所有值:“#”、“项目名称”、“状态”、“累积账单”, “账单调整”、“合同价值”?
  • 是的 - 并且都在同一列位置 - 如果需要,我可以重命名这些列
  • 您的最后一行无法正常工作。我会把它改成filter(str_detect(proj_num, "-"))
  • 为什么不直接抓取 A 到 N 列的所有内容,然后使用 select() 删除不需要的列?
  • 假设有 100 列“噪音”——我不禁相信有一个更有效的答案。

标签: r regex excel dplyr readxl


【解决方案1】:
library(tidyverse)
library(readxl)

filename <- "MyDataset.xlsx"

excel_sheets(filename) %>% 
  set_names() %>% 
  map_df(~ read_excel(
  path = filename,
  sheet = .,
  range = "A6:N1000"
) %>% 
  filter(str_detect(`#`, "-")) %>% 
  select(`#`, `PROJECT NAME`, `Status`, `Cumulative Billings`, `Billing Adjustment`, `Contract Value`), .id = "Month")

# A tibble: 8 x 7
  Month `#`       `PROJECT NAME` Status `Cumulative Billings` `Billing Adjustment` `Contract Value`
  <chr> <chr>     <chr>           <dbl>                 <dbl>                <dbl>            <dbl>
1 Jan18 1-11-0010 Project 1         715                  6723                 2138             1977
2 Jan18 1-11-0011 Project 2        1717                  8330                 8283             2588
3 Jan18 1-11-0012 Project 3        3332                  2908                 4938             7734
4 Jan18 1-11-0013 Project 4        2589                  8714                 6034             1476
5 Jan18 1-11-0014 Project 5         588                  4969                 2161             3334
6 Jan18 1-11-0015 Project 6         820                  7688                 4243             4293
7 Jan18 1-11-0020 Project 20       7287                   333                 9100             3078
8 Jan18 1-11-0030 Project 30       1564                   487                 7249             5508

map_df() 将遍历每个工作表(使用excel_sheets() 提取其名称)并创建一个数据框,其中有一列指示数据来自哪个工作表。

我不得不依靠这个answer 将工作表的名称应用为自己的列。

【讨论】:

    猜你喜欢
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 2015-08-02
    • 2018-04-18
    • 1970-01-01
    相关资源
    最近更新 更多