0

我正在使用read_excel导入 Excel 文件的速度和简单性。

不幸的是,目前还没有从数据集中排除不需要的选定列的能力。为了节省精力,我"x"col_names参数命名这些列,这比尝试跟踪 ,x1等更容易x2

如果可能的话,我想即时排除这些列,以避免额外的复制步骤,所以在伪代码中:

read_excel("data.xlsx", col_names = c("x", "keep", "x"))[ , !"x"]

我们可以使用readxl包中包含的示例数据集进行说明:

library(readxl)
DF <- read_excel(system.file("extdata/datasets.xlsx", package = "readxl"),
                 col_names = c("x", "x", "length", "width", "x"), skip = 1L)

我看到的工作方法并不完全是即时工作的,例如,已经存储了DF,我们现在可以这样做:

DF <- DF[ , -grep("^x$", names(DF))]

这可行,但需要通过存储复制DF它,然后覆盖它;我宁愿删除同一命令中的列,以便正确read_excel分配ab initioDF

其他类似的方法需要声明临时变量,如果可能的话,我更愿意避免,例如,

col_names <- c("x", "x", "length", "width", "x")
DF <- read_excel(system.file("extdata/datasets.xlsx", package = "readxl"),
                 col_names = col_names, skip = 1L)[ , -grep("^x$", col_names)]

有没有办法在不创建不必要的临时变量的情况下删除这些列?

(我可以转换为data.table,但我想知道是否有办法在没有 的情况下这样做data.table

4

2 回答 2

2

实际上有一种方法可以做到这一点readxl::read_excel,尽管它有点隐藏,而且我不知道列是否[暂时]被读入内存。诀窍是指定列类型,"blank"为那些你不想要的:

readxl::read_excel(system.file("extdata/datasets.xlsx", package = "readxl"),
                   col_types = c('blank', 'blank', 'numeric', 'numeric', 'text'))
## # A tibble: 150 x 3
##    Petal.Length Petal.Width Species
##           <dbl>       <dbl>   <chr>
## 1           1.4         0.2  setosa
## 2           1.4         0.2  setosa
## 3           1.3         0.2  setosa
## 4           1.5         0.2  setosa
## 5           1.4         0.2  setosa
## 6           1.7         0.4  setosa
## 7           1.4         0.3  setosa
## 8           1.5         0.2  setosa
## 9           1.4         0.2  setosa
## 10          1.5         0.1  setosa
## # ... with 140 more rows

需要注意的是,您需要知道所需列的所有数据类型,尽管我想您总是可以从文本开始,然后用type.convert或诸如此类的东西进行清理。

于 2016-07-15T22:11:20.783 回答
2

我没有看到避免复制的简单方法。但是使用管道可以实现一个衬垫,不需要临时变量。例如:

library(magrittr)
read_excel(system.file("extdata/datasets.xlsx", package = "readxl"), 
           col_names = c("x", "x", "length", "width", "x"), skip = 1L) %>% 
  extract(, -grep("^x$", names(.))) -> 
  DF
于 2016-07-15T21:09:39.933 回答