2017-10-09 4 views
1

Pour le vecteur suivant, je voudrais ne conserver que les deux premiers chiffres de chaque entier:R: Extraire deux premiers chiffres à partir d'éléments de liste imbriqués

a <- c('1234 2345 345 234', '323 55432 443', '43 23345 321') 

J'ai essayé de le faire en convertissant le vecteur en une liste imbriquée à l'aide strsplit puis appliquer substr à la liste:

a <- strsplit(a, ' ') 
a <- substr(a, start = 1, stop = 2) 

Cependant, cela semble juste extraire eh début de la commande concaténés:

a 
[1] "c(" "c(" "c(" 

Idéalement, je serais en mesure de contraindre le vecteur sous la forme suivante:

[[1]] 
[1] "12" "23" "34" "23" 

[[2]] 
[1] "32" "55" "44" 

[[3]] 
[1] "43" "23" "32" 

Répondre

3

Que diriez-vous

lapply(strsplit(a, " "), substr, 1, 2) 

cela ne explicitement un lapply sur les résultats de l'strsplit. C'est parce que substr() essaie de contraindre votre liste à un vecteur de caractères d'abord (il n'attend pas de liste car c'est le premier paramètre). Vous pouvez voir ce qu'il regarde si vous

as.character(strsplit(a, ' ')) 
# [1] "c(\"1234\", \"2345\", \"345\", \"234\")" "c(\"323\", \"55432\", \"443\")"   
# [3] "c(\"43\", \"23345\", \"321\")" 
+0

Cela a fonctionné fantastiquement - merci! Aussi, merci de prendre le temps d'expliquer comment j'ai mal compris 'substr()'. – kathystehl

0

On peut aussi extraire les deux premiers chiffres d'une limite de mot

library(stringr) 
str_extract_all(a, "\\b\\d{2}") 
#[[1]] 
#[1] "12" "23" "34" "23" 

#[[2]] 
#[1] "32" "55" "44" 

#[[3]] 
#[1] "43" "23" "32"