2014-07-25 4 views
9

동료,글자를 대문자로 표시합니다. "올바른"기능 엑셀의 R에 해당

나는 아래의 추출물 닮은 데이터 프레임에서 찾고 있어요 :

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 

, 내가 MS 엑셀에서 사용할 수있는 ROPER 기능의 R의 상응을 찾고 있어요.

+0

하는'tolower를'에서 capwords' 함수를 참조를 'help page – user20650

+0

'? tolower'의 예제 섹션에 정의 된'capwords' 함수가 있습니다. –

답변

7

을 기반으로합니다 : 그것은 주목할 가치가있을 수도 있습니다

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

그 :

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

엑셀 PROPER 대신에 "Hello World"를 제공합니다. Excel과 1 : 1 매핑의 경우 @Matthew Plourde를 참조하십시오.

당신이 실제로 필요로하는 대문자로 문자열의 첫 번째 문자를 설정하는 경우에는 짧은 약간 빠른 버전 고려해 볼 수 있습니다 :

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

이 함수를 적용한 후에 함수의 사용 가능한 숫자 열이 factor로 변경되었으므로 차트를 조금 엉망으로 만들었으므로주의해야합니다 다시 숫자. – Konrad

+0

@Konrad 그 경우,'data.frame (lapply (dat, function (x) if (.numeric (x)) x else proper (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

뒷면 참조가 필요합니까? 이 같은 결과를주지 않을까요? '\\ b [a-z]) ','\\ U \\ 1 ', tolower (xx), perl = TRUE)'gsub (" – Stan

8

또 다른 방법은 stringi 패키지를 사용합니다. stri_trans_general 함수는 첫 문자 이외의 모든 문자를 소문자로 표시합니다. 문제는 엑셀 PROPER와 (구) 허용 대답의 동등한에 관한

require(stringi) 
x <- c('woRd Word', 'Word', 'word words') 
stri_trans_general(x, id = "Title") 
[1] "Word Word" "Word"  "Word Words"