即时删除所有具有名称的列
Removing all columns with a name on the fly
我使用 read_excel
来导入 Excel 文件的速度和简单性。
不幸的是,目前还没有从数据集中排除不需要的选定列的功能;为了省力,我用 col_names
参数命名这些列 "x"
,这比试图跟踪 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
相同的命令中删除列以正确分配 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
或诸如此类的东西进行清理。
我使用 read_excel
来导入 Excel 文件的速度和简单性。
不幸的是,目前还没有从数据集中排除不需要的选定列的功能;为了省力,我用 col_names
参数命名这些列 "x"
,这比试图跟踪 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
相同的命令中删除列以正确分配 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
或诸如此类的东西进行清理。