2014-04-03 40 views
38
df <- structure(list(`a a` = 1:3, `a b` = 2:4), .Names = c("a a", "a b" 
), row.names = c(NA, -3L), class = "data.frame") 

選擇列名和數據的模樣dplyr:含空格

a a a b 
1 1 2 
2 2 3 
3 3 4 

以下調用選擇

select(df, 'a a') 

Error in abs(ind[ind < 0]) : 
    non-numeric argument to mathematical function 

如何選擇「 AA」和/或它重命名爲沒有空間ü唱select?我知道下面的方法:

  1. names(df)[1] <- "a"
  2. select(df, a=1)
  3. select(df, ends_with("a"))

,但如果我在一個大型數據集工作,我怎麼能得到一個確切的比賽不知道該指數NUMER或類似的列名?

回答

42

您可以通過使用反引號`select變量。

select(df, `a a`) 
# a a 
# 1 1 
# 2 2 
# 3 3 

但是,如果你的主要目標是要重命名列,您可以在plyr包中使用rename,在其中您可以同時使用""``

rename(df, replace = c("a a" = "a")) 
rename(df, replace = c(`a a` = "a")) 

或者在base R:

names(df)[names(df) == "a a"] <- "a" 

有關使用各種報價的更詳細說明,請參閱?Quotes。 '名稱和標識符'部分在此處尤其相關:

其他[語法無效]名稱可以使用,只要它們被引用。優選的報價是反引號」。

又見?make.names有關有效名稱。

參見this post有關dplyr

+2

你也可以做同樣的'select':'選擇(DF,A = \'一個一個\')' – Arun

+0

@Arun,感謝您的建議。但是,這不是重命名「一個」,_and_只選擇這個變量(與'rename'相比)? – Henrik

+0

亨裏克,你說得對。但是'rename'會複製整個data.frame來重命名列。所以,我不會使用它/認爲它有效。我不確定在'data.table'中是否有像'setattr'這樣的方法。例如:'setattr(df,'names',c(「a」,「b」))'通過引用在這裏重命名。 – Arun

0

重命名一些替代反引號,好dplyr 0.5.0,在中最新版本

如果您嘗試以編程方式選擇參數作爲列,並且您不想重命名或執行類似於paste/sprintf的列名稱爲反引號,你可以結合使用as.namenon-standard evaluation版本的select,這是select_

dplyr::select_(df, as.name("a a")) 

許多dplyr功能非標準版本。在select明確的情況下,也可以結合使用標準版本的選擇助手one_of。對於文檔見?dplyr::select_helpers

dplyr::select(df, dplyr::one_of("a a")) 
+0

這是不正確的。即使dplyr的NSE版本也無法處理它。例如: 'colnames(mtcars)[1] < - 「Miles Per Gallon」' 'mtcars%>%select _(「Miles Per Gallon」)' 這將返回一個錯誤。 – krthkskmr

+1

'mtcars%>%select_(as.name(「Miles Per Gallon」))'works。 – Andy