2015-11-13 17 views
9

Sembra una domanda così sciocca, ma non riesco a trovare una soluzione. Ho una colonna people$food con voci come chocolate o apple-orange-strawberry. Voglio dividere people$food per - e ottenere la prima voce dalla divisione. In Python, la soluzione sarebbe food.split('-')[0], ma non riesco a trovare un equivalente per R.Prima voce da Split Split

risposta

10

Se è necessario estrarre la prima (oppure nth) da ogni divisione, utilizzare:

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

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

o più veloce e più esplicitamente:

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

Entrambi i bit di codice sarà gestire bene con la selezione a seconda di quale valore nell'elenco scissione, e si occuperanno di casi che sono fuori della gamma:

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

Per esempio

word <- 'apple-orange-strawberry' 

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

o, equivalentemente

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

In sostanza l'idea è che dà split una lista come risultato, i cui elementi devono essere accessibili sia affettando (il primo caso) o non elencando (il secondo).

Se si desidera applicare il metodo per un'intera colonna:

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' è vettorizzato, quindi non c'è bisogno di "tranquillizzarlo" su ogni singolo oggetto nel vettore. Vedi la mia risposta qui sotto. – thelatemail

+0

Vero, non ne ero a conoscenza, grazie! – gented

3

userei sub() invece. Dato che vuoi la prima "parola" prima della divisione, possiamo semplicemente rimuovere tutto dopo il primo - e questo è quello che ci rimane.

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

Ecco un esempio -

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

In caso contrario, se si desidera utilizzare strsplit() si può radunare i primi elementi con vapply()

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

io suggerirei di usare head piuttosto che [ in R.

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