2014-07-25 14 views
9

Đồng nghiệp,Viết hoa chữ cái. R tương đương với excel chức năng "PROPER"

Tôi đang nhìn vào một khung dữ liệu giống như chiết xuất dưới đây:

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

Tôi muốn tận dụng chữ cái đầu tiên của mỗi từ và hạ thấp còn lại chữ cái cho mỗi từ. Điều này sẽ dẫn đến việc khung dữ liệu giống như hình dưới đây:

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

Trong một từ, tôi đang tìm kiếm tương đương R của các ROPER chức năng có sẵn trong MS Excel.

+0

Xem 'chức năng capwords' trong 'ToLower? 'help page – user20650

+0

Có một hàm' capwords' được định nghĩa trong phần Ví dụ của '? tolower'. –

Trả lời

7

Câu hỏi đặt ra là về một tương đương với Excel PROPER và (cũ) chấp nhận câu trả lời dựa trên:

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

Nó có thể là đáng chú ý là:

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

Excel PROPER thay vào đó, "Hello World". Để lập bản đồ 1: 1 với Excel, hãy xem @Matthew Plourde.

Nếu những gì bạn thực sự cần là để thiết lập chỉ ký tự đầu tiên của một chuỗi chữ hoa, bạn cũng có thể xem xét các phiên bản ngắn hơn và hơi nhanh hơn:

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

Tôi không nghĩ rằng có một, nhưng bạn có thể dễ dàng viết nó cho mình

(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

Cảm ơn bạn, đây là những gì tôi đang tìm kiếm. Đó là một điều tốt đẹp mà nên là một phần của cơ sở :) – Konrad

+0

Chỉ cần một lời cảnh báo rằng cột số có sẵn trong chức năng đã được thay đổi thành yếu tố sau khi tôi áp dụng chức năng này, điều này làm rối loạn biểu đồ một chút vì vậy tôi đã phải làm cho nó số một lần nữa. – Konrad

+0

@Konrad rằng trường hợp đó, tôi sẽ, 'data.frame (lapply (dat, function (x) if (is.numeric (x)) x else proper (x)))' hoặc một cái gì đó tương tự – rawr

17

Với biểu thức thông thường:

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]) nói tìm kiếm một chữ thường trước bởi một ranh giới từ (ví dụ , một khoảng trống hoặc đầu dòng). (?<=...) được gọi là xác nhận "nhìn sau". \\U\\1 nói thay thế ký tự đó bằng phiên bản chữ hoa. \\1 là tham chiếu ngược về nhóm đầu tiên được bao quanh bởi () trong mẫu. Xem ?regex để biết thêm chi tiết.

Nếu bạn chỉ muốn viết hoa chữ cái đầu tiên của từ đầu tiên, hãy sử dụng mẫu "^([a-z]) để thay thế.

+1

Đây là câu trả lời thực tế. Tôi kêu gọi người hỏi xem xét lại kiểm tra của họ. –

+0

Tài liệu tham khảo có cần thiết không? Điều này sẽ không cho kết quả tương tự? 'gsub (" (\\ b [a-z]) "," \\ U \\ 1 ", dung sai (xx), perl = TRUE)' – Stan

8

Phương pháp khác sử dụng gói stringi. Hàm stri_trans_general xuất hiện để giảm trường hợp tất cả các chữ cái khác với chữ cái đầu tiên.

require(stringi) 
x <- c('woRd Word', 'Word', 'word words') 
stri_trans_general(x, id = "Title") 
[1] "Word Word" "Word"  "Word Words" 
Các vấn đề liên quan