即时删除所有具有名称的列

Removing all columns with a name on the fly

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

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

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

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 相同的命令中删除列以正确分配 DF ab initio.

其他类似的方法需要声明临时变量,我希望尽可能避免,例如,

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 的方法)

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

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

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 或诸如此类的东西进行清理。