2015-11-13 14 views
9

To wydaje się takie głupie pytanie, ale nie mogę znaleźć rozwiązania. Mam kolumnę people$food, która ma wpisy takie jak chocolate lub apple-orange-strawberry. Chcę podzielić people$food przez - i uzyskać pierwszy wpis z podziału. W Pythonie, rozwiązaniem byłoby food.split('-')[0], ale nie mogę znaleźć odpowiednika dla R.Pierwszy wpis ze Splitu ze stringami

Odpowiedz

10

Jeśli trzeba wyodrębnić pierwszy (lub nth) wpis z każdego podziału, użyj:

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

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

lub szybszy i bardziej explictly:

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

Oba fragmenty kodu będzie dobrze poradzić sobie z wyborem tych dwóch wartości na liście podziału i będzie zajmować się sprawami, które są poza zakresem:

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

Na przykład

word <- 'apple-orange-strawberry' 

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

lub równoważnie

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

Zasadniczo chodzi o to, że daje split w rezultacie lista, której elementy muszą być dostępne albo przez cięcie (pierwszy przypadek), albo przez niepubliczne (drugie).

Jeśli chcesz zastosować metodę do całej kolumny:

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' jest vectorised, więc nie ma potrzeby "aprobować" go na każdy element w wektorze. Zobacz moją odpowiedź poniżej. – thelatemail

+0

To prawda, nie wiedziałem o tym, dzięki! – gented

3

użyłbym sub() zamiast. Ponieważ chcesz mieć pierwsze "słowo" przed podziałem, możemy po prostu usunąć wszystko po pierwszym - i to jest to, co nam zostało.

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

Oto przykład -

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

W przeciwnym razie, jeśli chcesz używać strsplit() można zaokrąglić w górę pierwsze elementy z vapply()

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

Sugerowałbym użyciu head zamiast [ w R.

word <- c('apple-orange-strawberry','chocolate') 
sapply(strsplit(word, "-"), head, 1) 
# [1] "apple"  "chocolate"