web-dev-qa-db-fra.com

Première entrée de la division de chaîne

J'ai une colonne people$food qui contient des entrées telles que chocolate ou Apple-orange-strawberry.

Je veux diviser people$food par - et obtenir la première entrée de la scission.

En python, la solution serait food.split('-')[0], mais je ne trouve pas d'équivalent pour R.

17
Pistol Pete

Si vous devez extraire la première entrée (ou nth) de chaque division, utilisez:

Word <- c('Apple-orange-strawberry','chocolate')

sapply(strsplit(Word,"-"), `[`, 1)
#[1] "Apple"     "chocolate"

Ou plus rapide et plus explicite:

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

Les deux bits de code se débrouillent bien avec la sélection de la valeur de la liste scindée et traitent les cas non compris dans la plage:

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

Par exemple

Word <- 'Apple-orange-strawberry'

strsplit(Word, "-")[[1]][1]
[1] "Apple"

ou équivalent

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

L'idée est essentiellement que split donne une liste en conséquence, dont les éléments doivent être accessibles soit en découpant (le premier cas), soit en défaisant (le dernier).

Si vous souhaitez appliquer la méthode à une colonne entière:

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"
13
gented

J'utiliserais plutôt sub(). Puisque vous voulez le premier "mot" avant la scission, nous pouvons simplement tout supprimer après le premier - et c'est ce qui nous reste. 

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

Voici un exemple - 

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

Sinon, si vous voulez utiliser strsplit(), vous pouvez arrondir les premiers éléments avec vapply()

vapply(strsplit(x, "-", fixed = TRUE), "[", "", 1)
# [1] "Apple"  "banana" "orange" "tomato"
4
Rich Scriven

Je suggérerais d'utiliser head plutôt que [ dans R.

Word <- c('Apple-orange-strawberry','chocolate')
sapply(strsplit(Word, "-"), head, 1)
# [1] "Apple"     "chocolate"
2
Ven Yao

dplyr/magrittr approche:

library(magrittr)
library(dplyr)

Word = c('Apple-orange-strawberry', 'chocolate')

strsplit(Word, "-") %>% sapply(extract2, 1)
# [1] "Apple"     "chocolate"
0
Ömer An