2014-07-25 8 views
9

साथियों,अक्षरों को कैपिटल करना। एक्सेल के "उचित" समारोह आर बराबर

मैं नीचे निकालने जैसी एक डेटा फ्रेम में देख रहा हूँ:

Month Provider Items 
January CofCom 25 
july CofCom 331 
march vobix 12 
May  vobix 0 

मैं प्रत्येक शब्द के पहले अक्षर को कैपिटल और शेष को कम करना चाहते हैं प्रत्येक शब्द के लिए पत्र। यह नीचे एक जैसी डेटा फ्रेम में परिणाम होगा:

Month Provider Items 
January Cofcom 25 
July Cofcom 331 
March Vobix 12 
May  Vobix 0 

एक शब्द में, मैं ROPER एमएस एक्सेल में उपलब्ध समारोह के आर के समकक्ष की तलाश में हूँ।

+0

'' देखें में tolower capwords' समारोह? 'मदद पृष्ठ – user20650

+0

एक' capwords' समारोह '? tolower' के उदाहरण अनुभाग में परिभाषित नहीं है। –

उत्तर

7

प्रश्न एक्सेल PROPER और (पूर्व) को स्वीकार कर लिया जवाब का एक बराबर के बारे में है पर आधारित है:

proper=function(x) paste0(toupper(substr(x, 1, 1)), tolower(substring(x, 2))) 

यह ध्यान देने योग्य हो सकता है कि:

proper("hello world") 
## [1] "Hello world" 

एक्सेल PROPER इसके बजाय, "हैलो वर्ल्ड" दे देंगे। एक्सेल के साथ 1: 1 मैपिंग के लिए @ मैट्ट्यू प्लॉर्डे देखें।

क्या आप वास्तव में जरूरत है अपर-केस के लिए एक स्ट्रिंग का केवल पहला चरित्र सेट करने के लिए है, तो आप भी छोटे और थोड़ा तेज संस्करण पर विचार हो सकता:

proper=function(s) sub("(.)", ("\\U\\1"), tolower(s), pe=TRUE) 
5

मुझे लगता है कि वहाँ एक है नहीं है, लेकिन आप आसानी से इसे अपने आप को

(dat <- data.frame(x = c('hello', 'frIENds'), 
        y = c('rawr','rulZ'), 
        z = c(16, 18))) 
#   x y z 
# 1 hello rawr 16 
# 2 frIENds rulZ 18 

proper <- function(x) 
    paste0(toupper(substr(x, 1, 1)), tolower(substring(x, 2))) 


(dat <- data.frame(lapply(dat, function(x) 
    if (is.numeric(x)) x else proper(x)), 
    stringsAsFactors = FALSE)) 

#   x y z 
# 1 Hello Rawr 16 
# 2 Friends Rulz 18 

str(dat) 
# 'data.frame': 2 obs. of 3 variables: 
# $ x: chr "Hello" "Friends" 
# $ y: chr "Rawr" "Rulz" 
# $ z: num 16 18 
+0

धन्यवाद, यह वही है जो मैं ढूंढ रहा था। यह एक अच्छी बात है कि आधार का हिस्सा होना चाहिए :) – Konrad

+0

फ़ंक्शन में संख्यात्मक कॉलम उपलब्ध होने के बारे में केवल एक शब्द को इस फ़ंक्शन को लागू करने के बाद कारक में बदल दिया गया था, जिसने चार्ट को थोड़ा गड़बड़ कर दिया था इसलिए मुझे इसे बनाना था संख्यात्मक फिर से। – Konrad

+0

@Konrad कि उस मामले में, मैं, 'data.frame (lapply (डीएटी, समारोह (x) यदि (is.numeric (x)) x बाकी उचित (x)))' या इसी तरह – rawr

17
नियमित अभिव्यक्ति के साथ

लिख सकते हैं:

x <- c('woRd Word', 'Word', 'word words') 
gsub("(?<=\\b)([a-z])", "\\U\\1", tolower(x), perl=TRUE) 
# [1] "Word Word" "Word"  "Word Words" 

(?<=\\b)([a-z]) कहते हैं एक शब्द सीमा से पहले एक छोटा अक्षर के लिए देखो (जैसे , एक जगह या एक रेखा की शुरुआत)। (?<=...) को "लुक-बैक" दावा कहा जाता है। \\U\\1 कहता है कि उस चरित्र को इसके अपरकेस संस्करण के साथ प्रतिस्थापित करें। \\1 पैटर्न में () से घिरा पहले समूह के लिए एक वापस संदर्भ है। अधिक जानकारी के लिए ?regex देखें।

आप केवल पहले शब्द का पहला अक्षर कैपिटल चाहते हैं, पैटर्न "^([a-z]) बजाय का उपयोग करें।

+1

यह वास्तविक जवाब है में विभिन्न वर्गों को संभालने के लिए समारोह का विस्तार कर सकते हैं। मैं प्रश्नकर्ता से उनकी जांच पर पुनर्विचार करने का आग्रह करता हूं। –

+0

क्या पीछे संदर्भ आवश्यक है? क्या यह वही परिणाम नहीं देगा? 'Gsub (" (\\ बी [a-z]) "," \\ यू \\ 1 ", tolower (xx), पर्ल = TRUE)' – Stan

8

एक अन्य विधि stringi पैकेज का उपयोग करता है। Stri_trans_general फ़ंक्शन प्रारंभिक अक्षर के अलावा सभी अक्षरों को कम केस में प्रकट होता है।

require(stringi) 
x <- c('woRd Word', 'Word', 'word words') 
stri_trans_general(x, id = "Title") 
[1] "Word Word" "Word"  "Word Words" 
संबंधित मुद्दे