2012-10-05 12 views
19

मुझे पता है कि यह पसंद किया जाता है यदि परिवर्तनीय नामों में रिक्त स्थान नहीं हैं। मेरे पास एक ऐसी स्थिति है जहां मुझे प्रकाशन-गुणवत्ता चार्ट की आवश्यकता है, इसलिए अक्ष और किंवदंतियों को रिक्त स्थान के साथ उचित स्वरूपित लेबल होना चाहिए। तो, उदाहरण के लिए, विकास में मैं चर "Pct.On.OAC" और Age.Group कहा जाता हो, लेकिन मेरा अंतिम साजिश में मैं "OAC पर%" और "आयु समूह" की जरूरत है प्रकट करने के लिए:कॉलम नामों में रिक्त स्थान से कैसे निपटें?

'data.frame': 22 obs. of 3 variables: 
$ % on OAC   : Factor w/ 11 levels "0","0.1-9.9",..: 1 2 3 4 5 6 7 8 9 10 ... 
$ Age Group   : Factor w/ 2 levels "Aged 80 and over",..: 1 1 1 1 1 1 1 1 1 1 ... 
$ Number of Practices: int 47 5 33 98 287 543 516 222 67 14 ... 

लेकिन जब मैं इन प्लॉट करने के लिए प्रयास करें:

ggplot(dt.m, aes(x=`% on OAC`,y=`Number of Practices`, fill=`Age Group`)) + 
    geom_bar() 
) 

उस के साथ कोई समस्या नहीं है। लेकिन जब मैं एक पहलू जोड़ें:

ggplot(dt.m, aes(x=`% on OAC`,y=`Number of Practices`, fill=`Age Group`)) + 
    geom_bar() + 
    facet_grid(`Age Group`~ .) 

मैं Error in मिल [.data.frame (base, names(rows)) : undefined columns selected

अगर मैं बदल Age GroupAge.Group लिए तो यह ठीक काम करता है, लेकिन जैसा कि मैंने कहा, मैं डॉट नहीं करना चाहते शीर्षक कथा में शामिल होने के लिए।

तो मेरी प्रश्न हैं:

  1. वहाँ पहलू के साथ समस्या के लिए एक समाधान है?
  2. क्या चरम नामों में रिक्त स्थान (और अन्य पात्रों) की समस्या से निपटने के लिए एक बेहतर सामान्य दृष्टिकोण है जब मैं अंतिम साजिश उन्हें शामिल करना चाहता हूं? मुझे लगता है कि मैं उन्हें मैन्युअल रूप से ओवरराइड कर सकता हूं, लेकिन ऐसा लगता है कि यह बहुत सारे फफिंग के आसपास है।
+0

उपयोग scale_fill (नाम = "आयु समूह") या इसी तरह का उत्पादन करने के लिए। – mnel

+0

@mnel क्षमा करें, मैंने आपका अनुसरण नहीं किया - यह facet_grid के साथ समस्या को कैसे हल करता है? मैं 'scale_fill (name = "आयु समूह") '_instead_ का उपयोग करता हूं? –

उत्तर

14

यह एक "बग" पैकेज ggplot2 कि तथ्य यह है कि आंतरिक ggplot2 समारोह quoted_df में समारोह as.data.frame() नाम में धर्मान्तरित से आता है वाक्य रचना वैध नाम ये वाक्य रचनात्मक रूप से वैध नाम मूल डेटाफ्रेम में नहीं मिल सकते हैं, इसलिए त्रुटि।

आपको याद दिलाना करने के लिए:

वाक्य रचना वैध नाम अक्षर, संख्या और डॉट या रेखांकन वर्ण हैं, और एक पत्र या डॉट के साथ शुरू (लेकिन डॉट एक नंबर के बाद नहीं किया जा सकता)

इसके लिए एक कारण है।इस कोड को काम

ggplot(X, aes(x=PonOAC,y=NumberofPractices, fill=AgeGroup)) + 
    geom_bar() + 
    facet_grid(AgeGroup~ .) + 
    labs(x="% on OAC", y="Number of Practices",fill = "Age Group") 

बनाने के लिए

X <-data.frame(
    PonOAC = rep(c('a','b','c','d'),2), 
    AgeGroup = rep(c("over 80",'under 80'),each=4), 
    NumberofPractices = rpois(8,70) 
) 

आप अंत में प्रयोगशालाओं का उपयोग कर सकते हैं: यह भी एक कारण है कि ggplot आप labs, जैसे का उपयोग कर वैध नाम के साथ निम्नलिखित डमी डेटासेट का उपयोग करके लेबल सेट करने देता है

enter image description here

+1

पीएस: जैसा कि @DirkEddelbuettel बताता है, फ़ंक्शन 'as.data.frame' फ़ंक्शन' make.names() 'आंतरिक रूप से उन नामों को "सही" करने के लिए उपयोग करता है (यानी मान्य पहचानकर्ता बनाएं)। –

20

आप से पूछा "वहाँ चर नाम में रिक्त स्थान (और अन्य वर्ण) की समस्या से निपटने के लिए एक बेहतर सामान्य दृष्टिकोण है" और हाँ वहाँ से कुछ हैं:

  • बस उन्हें का उपयोग नहीं करते जैसा कि आप यहां अनुभव करते हैं, जैसे चीजें तोड़ेंगी
  • सुरक्षित नाम बनाने के लिए make.names() फ़ंक्शन का उपयोग करें; इसका उपयोग आर द्वारा भी पहचानकर्ता बनाने के लिए किया जाता है (उदाहरण के लिए रिक्त स्थान आदि के लिए अंडरस्कोर का उपयोग करके)
  • यदि आपको बैकटिक्स के साथ असुरक्षित पहचानकर्ताओं की रक्षा करनी है। पिछले दो अंक के लिए

उदाहरण:

R> myvec <- list("foo"=3.14, "some bar"=2.22) 
R> myvec$'some bar' * 2 
[1] 4.44 
R> make.names(names(myvec)) 
[1] "foo"  "some.bar" 
R> 
+0

हां, लेकिन इस मामले में (क्योंकि ggplot कुछ अतिरिक्त मूल्यांकन करता है), बैकटिक्स के साथ सुरक्षा काम नहीं करती है, इसलिए हम आपके बिंदु # 1 पर वापस आ गए हैं ... –

+0

निश्चित रूप से, क्योंकि कोई अन्य आसानी से अन्य पैकेज नहीं बदल सकता । एक कारण है कि मैंने उन्हें जिस तरह से किया था। बैकिक्स आखिरी उपाय है। –

संबंधित मुद्दे