Question
Im essayant de diviser une chaîne sur « » et créer des colonnes supplémentaires avec les deux chaînes avant et après « ».
tes<-c("1.abc","2.di","3.lik")
dat<-c(5,3,2)
h<-data.frame(tes,dat)
h$num<-substr(h$tes,1,1)
h$prim<-unlist(strsplit(as.character(h$tes),"\\."))[2]
h$prim<-sapply(h$tes,unlist(strsplit(as.character(h$tes),"\\."))[2])
comme h$prim
à Id contenir « abc », « di », « lik » .. Mais je ne suis pas en mesure de comprendre. Je suppose que strsplit
non vectorisé, mais je pensais que la version sapply
aurait dû fonctionner. Cependant, je suppose qu'il devrait être facile: -)
Cordialement, // M
La solution
Cela devrait faire l'affaire
R> sapply(strsplit(as.character(h$tes), "\\."), "[[", 2)
[1] "abc" "di" "lik"
Autres conseils
Avec le paquet stringr
il est encore plus facile:
library(stringr)
str_split_fixed(h$tes, fixed("."), 2)[, 2]
est le même que la réponse de rcs, mais il peut être plus facile à comprendre:
> sapply(strsplit(as.character(h$tes), "\\."), function(x) x[[2]])
[1] "abc" "di" "lik"
Cette question apparaît plusieurs fois sur StackOverflow.
forme exacte que le vôtre:
- Sélection premier élément de
strsplit
- Sélection second élément séparé de l'espace
- Sélection deuxième élément séparé par point je recommande cette question pour voir combien de façons il pourrait être atteint.
Certains question similaire à ce sujet:
Vous pouvez vous épargner le travail de tirer le 2ème élément si vous ajoutez les deux colonnes en même temps:
tes <- c("1.abc","2.di","3.lik")
dat <- c(5,3,2)
h <- data.frame(tes, dat, stringsAsFactors=FALSE)
values <- unlist(strsplit(h$tes, ".", fixed=TRUE))
h <- cbind(h, matrix(values, byrow=TRUE, ncol=2,
dimnames=list(NULL, c("num", "prim"))))