2015-11-13 22 views
9

Điều này có vẻ như một câu hỏi ngu ngốc như vậy, nhưng tôi không thể tìm thấy giải pháp. Tôi có một cột people$food có các mục nhập như chocolate hoặc apple-orange-strawberry. Tôi muốn chia people$food bởi - và nhận mục nhập đầu tiên từ phần tách. Trong python, giải pháp sẽ là food.split('-')[0], nhưng tôi không thể tìm thấy một tương đương cho R.Mục nhập đầu tiên từ chuỗi tách

Trả lời

10

Nếu bạn cần giải nén đầu tiên (hoặc nth) mục nhập từ mỗi phần tách, sử dụng:

word <- c('apple-orange-strawberry','chocolate') 

sapply(strsplit(word,"-"), `[`, 1) 
#[1] "apple"  "chocolate" 

Hoặc nhanh hơn và explictly hơn:

vapply(strsplit(word,"-"), `[`, 1, FUN.VALUE=character(1)) 
#[1] "apple"  "chocolate" 

Cả hai bit của mã sẽ đối phó tốt với lựa chọn bất cứ giá trị trong danh sách phân chia, và sẽ đối phó với trường hợp nằm ngoài phạm vi:

vapply(strsplit(word,"-"), `[`, 2, FUN.VALUE=character(1)) 
#[1] "orange" NA 
7

Ví dụ

word <- 'apple-orange-strawberry' 

strsplit(word, "-")[[1]][1] 
[1] "apple" 

hoặc tương đương

unlist(strsplit(word, "-"))[1]. 

Về cơ bản ý tưởng là split cho một danh sách là kết quả, mà các phần tử của nó phải được truy cập bằng cách cắt (trường hợp cũ) hoặc bằng cách không công bố (sau này).

Nếu bạn muốn áp dụng phương pháp này cho toàn bộ một cột:

first.word <- function(my.string){ 
    unlist(strsplit(my.string, "-"))[1] 
} 

words <- c('apple-orange-strawberry', 'orange-juice') 

R: sapply(words, first.word) 
apple-orange-strawberry   orange-juice 
       "apple"    "orange" 
+0

'strsplit' là vectơ, do đó, không cần phải 'sapply' nó trên mỗi mục riêng lẻ trong vector. Xem câu trả lời của tôi dưới đây. – thelatemail

+0

Đúng, tôi không biết điều đó, cảm ơn! – gented

3

Tôi sẽ sử dụng sub() để thay thế. Vì bạn muốn "từ" đầu tiên trước khi chia nhỏ, chúng tôi chỉ có thể xóa mọi thứ sau - đầu tiên và đó là những gì chúng tôi còn lại.

sub("-.*", "", people$food) 

Dưới đây là một ví dụ -

x <- c("apple", "banana-raspberry-cherry", "orange-berry", "tomato-apple") 
sub("-.*", "", x) 
# [1] "apple" "banana" "orange" "tomato" 

Ngược lại, nếu bạn muốn sử dụng strsplit() bạn có thể khỏa lấp lên các yếu tố đầu tiên với vapply()

vapply(strsplit(x, "-", fixed = TRUE), "[", "", 1) 
# [1] "apple" "banana" "orange" "tomato" 
2

Tôi khuyên bạn nên sử dụng head thay vì [ trong R.

word <- c('apple-orange-strawberry','chocolate') 
sapply(strsplit(word, "-"), head, 1) 
# [1] "apple"  "chocolate" 
Các vấn đề liên quan