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)
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 ...
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.
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.
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"
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)
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]])
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