2016-06-29 88 views
2

比方說,我有以下的數據幀:選擇與dplyr ::選擇()多列以數字作爲名稱

a <- runif(10) 
dd <- as.data.frame(t(a)) 
names(dd) <- c("ID", "a", "a2", "b", "b2", "f", "XXX", "1", "4", "8") 

dplyr,有一個很好的方式,選擇一些列。例如,選擇列一個和列˚F之間的專欄中,我可以使用

dd %>% dplyr::select(a:f) 

在我的問題,數據幀的最後部分的列可能會有所不同,但他們總是有作爲名稱1到99之間的數字。但是,我似乎無法能夠做同樣的伎倆如上:

> dd %>% select(1:99) 
Error: Position must be between 0 and n 
> dd %>% select("1":"99") 
Error: Position must be between 0 and n 

這是因爲使用select()試圖以這種方式來選擇的位置列。

我想能夠獲得˚F一個之間的所有列的數據幀,以及與那些屬於和之間的數字標籤。這可能與select()一起完成嗎?

回答

6

以數字開頭的列名(例如數據中的「1」和「8」)不是句法上有效的名稱(請參閱?make.names)。然後請參閱?Quoutes中的「名稱和標識符」部分:「可以使用其他[語法無效]名稱,只要它們被引用。首選的引號是反引號」。

因此,包裹無效列名反引號(`):

dd %>% dplyr::select(a:f, `1`:`8`) 

#   a  a2   b  b2   f   1   4   8 
# 1 0.2510023 0.4109819 0.6787226 0.4974859 0.01828614 0.7449878 0.1648462 0.5875638 

另一種選擇是使用select的SE版本,select_

dd %>% dplyr::select_(.dots = c("a", "a2", ..., "1", "4", "8")) 
+0

有沒有像'1':'99'這樣的方法,即使列99不在這個特定的數據集中? – Theodor

+0

@Theodor不是直接的,但是使用函數'select_'可以傳遞一個列名的數組,所以你可以像'select *(.docs)(dd)[% (1:99)])'作爲解決方法 – AlexR

3

我們可以選擇列:f,並通過將數字轉換爲數字來添加數字列的索引:

dd %>% 
    select(a:f, which(!is.na(as.numeric(colnames(dd)))))