Domanda
Nel tentativo di dividere una stringa su "" e creare colonne aggiuntive con le due stringhe prima e dopo "".
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])
I'd come h$prim
per contenere "abc", "di", "lik" .. Comunque io non sono in grado di capirlo. Credo che strsplit
non è vettorializzare, ma poi ho pensato che la versione sapply
avrebbe dovuto funzionare. Tuttavia suppongo che dovrebbe essere facile: -)
Saluti, // M
Soluzione
Questo dovrebbe fare il trucco
R> sapply(strsplit(as.character(h$tes), "\\."), "[[", 2)
[1] "abc" "di" "lik"
Altri suggerimenti
Con il pacchetto stringr
è ancora più facile:
library(stringr)
str_split_fixed(h$tes, fixed("."), 2)[, 2]
Questa è la stessa risposta RCS', ma può essere più facile da capire:
> sapply(strsplit(as.character(h$tes), "\\."), function(x) x[[2]])
[1] "abc" "di" "lik"
Questa domanda appare più volte su StackOverflow.
In forma esatta come la tua:
- Selezione primo elemento di
strsplit
- Selezione secondo elemento separato dallo spazio
- Selezione secondo elemento separato dal punto vi consiglio questa domanda per vedere in quanti modi si potrebbe essere raggiunto.
Alcuni domanda simile in questa discussione:
- Split senza separatore
- Prima parte come nella tua domanda, ma è stato il cambiamento di caso più complesso
E se avete a cuore la velocità allora si dovrebbe prendere in considerazione fixed parametro strsplit
.
In alternativa, si può risparmiare il lavoro di tirare fuori il 2 ° elemento se si aggiungono entrambe le colonne allo stesso tempo:
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"))))