2013-02-17 98 views
3

我有一個數據集,不幸的是我的dataframe中的一些列標籤包含符號( - 或+)。這似乎並不理會dataframe,但是當我嘗試繪圖這跟qplot它將引發我一個錯誤:在qplot中使用帶有數據幀符號的列名稱

x <- 1:5 
y <- x 
names <- c("1+", "2-") 

mydf <- data.frame(x, y) 
colnames(mydf) <- names 
mydf 
qplot(1+, 2-, data = mydf) 

,如果我用引號將列名會只給我一個類別(或這樣的話,它會給我一個「1+」與「2-」的情節,中間有一個點)。

可以輕鬆做到這一點嗎?我看着aes_string,但不太明白它(至少不足以讓它工作)。

在此先感謝。

P.S.我在網上搜索了一個解決方案,但無法找到任何有助於我的事情(這可能是由於某些方面我不明白),所以我認爲這可能是因爲這是一個完全延遲的命名方案,我有:p。

回答

2

正如在另一個答案中所說,你有一個問題,因爲你沒有標準名稱。當解決方案要避免backticks表示法是將colnames轉換爲標準形式。將姓名轉換爲常規姓名的另一個動機是,例如,您不能在lattice情節中使用backticks。因此

gsub('(^[0-9]+)[+|-]+|[+|-]+','a\\1',c("1+", "2-","a--")) 
[1] "a1" "a2" "aa" 

,將其應用到您的例子:使用gsub你可以做到這一點

colnames(mydf) <- gsub('(^[0-9]+)[+|-]+|[+|-]+','a\\1',colnames(mydf)) 
qplot(a1,a2,data = mydf) 

EIDT

可以使用make.names與選項唯一= T

make.names(c("10+", "20-", "10-", "a30++"),unique=T) 
[1] "X10." "X20." "X10..1" "a30.." 

如果你不喜歡R n阿明的規則,這裏的定製版本使用gsubfn

library(gsubfn) 
gsubfn("[+|-]|^[0-9]+", 
function(x) switch(x,'+'= 'a','-' ='b',paste('x',x,sep='')), 
c("10+", "20-", "10-", "a30++")) 
"x10a" "x20b" "x10b" "a30aa" ## note x10b looks better than X10..1 
+1

或使用'名字(是myDF)< - make.names(名稱(myDF上))',如果你不介意的話,使用R的默認規則,這樣的消毒。 – 2013-02-17 17:47:02

+1

@BenBolker優秀!!如果他有類似'make.names(c('a +','a - '))'的話,這可能不起作用。 – agstudy 2013-02-17 17:49:40

+2

是的,雖然這失敗(=導致相同的列名稱)與您的解決方案以及... – 2013-02-17 17:52:34

3

由於您有非標準的列名稱,您需要在列引用中使用反引號(`)。

例如:

mydf$`1+` 
[1] 1 2 3 4 5 

所以,你qplot()電話應該是這樣的:

qplot(`1+`, `2-`, data = mydf) 

enter image description here


可以在?Quotes?names

找到更多的信息
相關問題