2016-07-15 47 views
0

我使用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從頭開始

其他類似的方法需要聲明的臨時變量,我寧願避免可能的話,例如,

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

+1

你打算使用'dplyr'嗎?你可以將它傳入'select()'而不必首先顯式創建一個變量。 (當然,無論你是否命名它,完整的data.frame仍然存在)。如果唯一的問題是額外的變量,只需創建你自己的函數dropXcolumns()或其他東西。 – MrFlick

+2

關於'需要通過存儲DF來複制DF':我想即使將它製作成一行,也是可以複製的,所以我認爲你是沒有問題的。避免複製的唯一方法是如果'read_excel'明確允許它(類似於'data.table :: fread'的'select'參數)。 – nicola

+1

'XLConnnect :: readWorksheet'(雖然你可能想要'readWorksheetFromFile',但它有更好的文檔)有列的'keep'和'drop'參數。不過,它是基於Java的,所以安裝比平時稍微複雜一些。 – alistaire

回答

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或什麼來清理。

+0

有趣。我用'readxl'提交了[#193](https://github.com/hadley/readxl/issues/193),因爲這確實相當不完善。 – MichaelChirico

+1

無論如何,如果我正確理解C++代碼,它不會讀取任何「空白」列,就像(?)[這裏](https://github.com/hadley/readxl/blob/7c7f66b29764eee91385c9f1fc755b1ac6c10e08/src /CellType.h#L132-L141)。幹得好! – MichaelChirico

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