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
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
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"
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"
Sugerowałbym użyciu head
zamiast [
w R.
word <- c('apple-orange-strawberry','chocolate')
sapply(strsplit(word, "-"), head, 1)
# [1] "apple" "chocolate"
'strsplit' jest vectorised, więc nie ma potrzeby "aprobować" go na każdy element w wektorze. Zobacz moją odpowiedź poniżej. – thelatemail
To prawda, nie wiedziałem o tym, dzięki! – gented