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

Était-ce utile?

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:

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"))))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top