2016-11-08 37 views
0

我有一個15000 obs的數據幀。 45個變量,與下面給出的示例輸入數據框具有相似的結構/模式/類。刪除/子集或基於標題名稱的一部分選擇列

我想要做的是選擇「日期」列+包含「_MIN」作爲標題的一部分,並把它們放入一個新的DF。 &選擇「Date」列+包含「_MIN」的列作爲標題的一部分並將它們放入新的df中。

所以我基本上是尋找一種方法來選擇或基於列標題的一部分名稱的整個列子集。舉例:多列包含一個「_」下劃線,我想刪除或選擇這些列。

INPUT dataframe: 
Example <- data.frame(Date=seq(as.Date("1979/1/1"),as.Date("1979/1/5"), by="day"), ca_MIN=1:5, ca_MAX=2:6, cb_MIN=3:7, cb_MAX=4:8) 

>Example 

    Date     ca_MIN  ca_MAX  cb_MIN  cb_MAX 
    1 1979-01-01   1   2   3   4 
    2 1979-01-02   2   3   4   5 
    3 1979-01-03   3   4   5   6 
    4 1979-01-04   4   5   6   7 
    5 1979-01-05   5   6   7   8 

OUTPUT dataframes, selected based on the column names "_MAX", "_MIN": 
Example_MIN <- data.frame(Date=seq(as.Date("1979/1/1"),as.Date("1979/1/5"),  by="day"), ca_MIN=1:5, cb_MIN=3:7) 
Example_MAX <- data.frame(Date=seq(as.Date("1979/1/1"),as.Date("1979/1/5"), by="day"), ca_MAX=2:6, cb_MAX=4:8) 

>Example_MIN 

    Date   ca_MIN cb_MIN 
    1 1979-01-01  1  3 
    2 1979-01-02  2  4 
    3 1979-01-03  3  5 
    4 1979-01-04  4  6 
    5 1979-01-05  5  7 

在它的工作原理與時刻:

Example_MIN <-Example 
Example_MAX <-Example 
subset(ExampleMIN,select=-c(2,4)) 
subset(ExampleMAX,select=-c(3,5)) 

然而,這讓我對大數據集的錯誤(雖然結果對我的作品):

Error in `[.data.table`(x, r, vars, with = FALSE) : j out of bounds 

有一個不那麼麻煩的方式來做到這一點?

我寧願它也處理數據集與大量列&列「_MIN」&「_MAX」不排序爲奇數和偶數列號?

我看到帖子說是相關的,但我沒有管理這麼遠來創建工作代碼...

+0

'示例[grepl(「_ MIN」,names(Example))]'和'Example [grepl(「_ MAX」,names(Example))]' –

+0

,並從錯誤信息中看起來像'data.table'。在這種情況下'Example [,grepl(「_ MIN」,names(Example)),with = F]' –

+1

@Ronak Shah。是的,顯然是在我的腳本的某個地方,我的data.frame變成了一個data.table。這就是爲什麼我以前的嘗試沒有奏效。感謝您指出了這一點。我會在下次執行操作時記住這一點:) –

回答

0

夫婦的方式來做到這一點。

grepl("_",names(Example)會給你trues和falses列表這些列,所以:

Example[,grepl("_",names(Example)]會給你正確的子集data.frame。

更友好的方式來做到這一點是使用dplyr:

Example %>% select(contains("_"))

一個練習你然後將是如何選擇這些列和日期列。針對base-R解決方案的提示:|是OR,&是邏輯AND。祝你好運!在名稱

+0

我使用'Example.max < - 示例[,grepl(「_ MAX」,names(Example)),with = F]'&'示例。max < - cbind(示例$ Date,示例)' –

+0

關閉...但您可以做得更好......嘗試將兩個條件合併成一個...所以'Example [,CONDITIONS]'。條件是「_」和「日期」。嘗試...在一個步驟中指定多個過濾器對於您的R技能非常重要。如果你無法得到它,我會告訴你如何。另外,請嘗試dplyr的方式...如果你不知道dplyr,你應該學習! –

+0

我之前使用過dplyr包,但似乎無法將這兩個函數結合起來。我相對較新的R,所以我可能在大多數時間工作效率低下...... dplyr包會使用bind_cols而不是cbind嗎?也許使用select_if來選擇列? –

0

嘗試grep的,關鍵是做一個適當的$裁判日期列以及

Example_MIN <- Example[ , c(Example$Date, grep('_MIN', names(Example)))] 
+0

在我的數據集中生成以下錯誤:grep(「_ MAX」)中的錯誤:參數「x」丟失,沒有默認設置 –

+0

是的,這是因爲您遺漏了名稱(x)部分... –

0

U可以使用stringr軟件包,然後從列名的載體:

Example <- data.frame(Date=seq(as.Date("1979/1/1"),as.Date("1979/1/5"), by="day"), ca_MIN=1:5, ca_MAX=2:6, cb_MIN=3:7, cb_MAX=4:8) 
library(stringr) 
# columns including MIN 
chosenColumns <- str_detect(names(Example), "MIN") 
#include also dates 
chosenColumns[1] <- TRUE 
mins <- Example[, chosenColumns]