2013-10-11 24 views
5

Nói rằng tôi có một vector của tên các dân tộc ở dataframe tôi:Trích xuất tên đầu tiên trong R

names <- c("Bernice Ingram", "Dianna Dean", "Philip Williamson", "Laurie Abbott", 
      "Rochelle Price", "Arturo Fisher", "Enrique Newton", "Sarah Mann", 
      "Darryl Graham", "Arthur Hoffman") 

Tôi muốn tạo ra một vector với những cái tên đầu tiên. Tất cả những gì tôi biết về họ là chúng đến đầu tiên trong vectơ ở trên và chúng được theo sau bởi một không gian. Nói cách khác, đây là những gì tôi đang tìm kiếm:

"Bernice" "Dianna" "Philip" "Laurie" "Rochelle" 
"Arturo" "Enrique" "Sarah" "Darryl" "Arthur" 

Tôi đã tìm thấy một câu hỏi tương tự here, nhưng câu trả lời (đặc biệt là this one) đã không giúp nhiều. Cho đến nay, tôi đã thử một vài biến thể của hàm từ grep family và gần nhất tôi có thể nhận được một cái gì đó hữu ích là chạy strsplit(names, " ") để tách các tên đầu tiên và sau đó strsplit(names, " ")[[1]][1] để chỉ lấy tên của người đầu tiên. Tôi đã cố gắng để tinh chỉnh lệnh cuối cùng này để cho tôi một vector toàn bộ các tên đầu tiên, vô ích.

Trả lời

10

Sử dụng sapply để trích xuất các tên đầu tiên:

> sapply(strsplit(names, " "), `[`, 1) 
[1] "Bernice" "Dianna" "Philip" "Laurie" "Rochelle" "Arturo" "Enrique" 
[8] "Sarah" "Darryl" "Arthur" 

Một số nhận xét:

Các công trình trên chỉ tốt. Để làm cho thông số chung hơn một chút, bạn có thể thay đổi thông số split ở hàm strsplit từ " " trong "\\s+" bao gồm nhiều khoảng trắng. Sau đó, bạn cũng có thể sử dụng gsub để trích xuất trực tiếp mọi thứ trước một không gian. Cách tiếp cận cuối cùng này sẽ chỉ sử dụng một cuộc gọi hàm và có khả năng nhanh hơn (nhưng tôi chưa kiểm tra với điểm chuẩn).

3

Điều này dường như làm việc:

unlist(strsplit(names,' '))[seq(1,2*length(names),2)] 

Giả sử không có tên đầu tiên/cuối cùng có các khoảng trống trong đó.

3

Sử dụng regexpr trên gsub

> gsub("^(.*?)\\s.*", "\\1", names) 
[1] "Bernice" "Dianna" "Philip" "Laurie" "Rochelle" "Arturo" "Enrique" "Sarah" 
[9] "Darryl" "Arthur" 
+2

hoặc 'phụ ('*', '', tên)' – eddi

5

Đối với những gì bạn muốn, đây là một cách khá chính thống để làm điều đó:

read.table(text = names, header = FALSE, stringsAsFactors=FALSE, fill = TRUE)[[1]] 
# [1] "Bernice" "Dianna" "Philip" "Laurie" "Rochelle" "Arturo" "Enrique" "Sarah" 
# [9] "Darryl" "Arthur" 
+0

đẹp! và trong trường hợp ai đó có tên thứ hai tôi đề nghị đặt 'fill = T' :) – Michele

+0

@Michele, Cảm ơn. Tôi đã * dự định làm điều đó, nhưng quên làm như vậy khi đăng. Sẽ cập nhật ngay bây giờ. – A5C1D2H2I1M1N2O1R2T1

Các vấn đề liên quan