web-dev-qa-db-fra.com

Fractionner un vecteur de chaîne dans un espace blanc

J'ai le vecteur suivant:

tmp3 <- c("1500 2", "1500 1", "1510 2", "1510 1", "1520 2", "1520 1", "1530 2", 
"1530 1", "1540 2", "1540 1")

Je voudrais simplement conserver le deuxième nombre dans chacun des atomes de ce vecteur, il se lirait donc:

c(2,1,2,1,2,1,2,1,2,1)
37
Zak

Il y a probablement un meilleur moyen, mais voici deux approches avec strsplit():

as.numeric(data.frame(strsplit(tmp3, " "))[2,])
as.numeric(lapply(strsplit(tmp3," "), function(x) x[2]))

L'as.numeric () peut ne pas être nécessaire si vous pouvez utiliser des caractères ...

36
Shane

On pourrait utiliser read.table sur textConnection:

X <- read.table(textConnection(tmp3))

ensuite

> str(X)
'data.frame':   10 obs. of  2 variables:
 $ V1: int  1500 1500 1510 1510 1520 1520 1530 1530 1540 1540
 $ V2: int  2 1 2 1 2 1 2 1 2 1

donc X$V2 est ce dont vous avez besoin.

21
Marek

Cela dépend un peu de la façon dont vos données réelles correspondent aux données d'exemple que vous avez fournies. Si vous essayez simplement de tout récupérer après l'espace, vous pouvez utiliser gsub:

gsub(".+\\s+", "", tmp3)
[1] "2" "1" "2" "1" "2" "1" "2" "1" "2" "1"

Si vous essayez d'implémenter une règle plus compliquée que "tout prendre après l'espace", vous aurez besoin d'une expression régulière plus compliquée.

11
SchaunW

Je pense que c'est la façon la plus élégante de le faire

>     res <- sapply(strsplit(tmp3, " "), "[[", 2)

Si vous en avez besoin pour être un entier

>     storage.mode(res) <- "integer"
9
ephpostfacto
substr(x = tmp3, start = 6, stop = 6)

Tant que vos cordes sont toujours de la même longueur, cela devrait faire l'affaire.

(Et, bien sûr, vous n'avez pas besoin de spécifier les noms des arguments - substr(tmp3, 6, 6) fonctionne très bien aussi)

5
Matt Parker

Cela devrait le faire:

library(plyr)
ldply(strsplit(tmp3, split = " "))[[2]]

Si vous avez besoin d'un vecteur numérique, utilisez

as.numeric(ldply(strsplit(tmp3, split = " "))[[2]])
4
Paolo

Une autre option est scan(). Pour obtenir la deuxième valeur, nous pouvons utiliser un sous-ensemble logique.

scan(text = tmp3)[c(FALSE, TRUE)]
#  [1] 2 1 2 1 2 1 2 1 2 1
1
Rich Scriven