2010-09-13 7 views
14

En essayant de diviser une chaîne sur "." et créez des colonnes supplémentaires avec les deux chaînes avant et après ".".appliquer strsplit rowwise

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 n'est pas vectorisé, mais alors je pensais que la version sapply aurait dû fonctionner. Cependant, je suppose qu'il devrait être :-) facile

Cordialement, // M

Répondre

30

Cela devrait faire l'affaire

R> sapply(strsplit(as.character(h$tes), "\\."), "[[", 2) 
[1] "abc" "di" "lik" 
+1

Allright .. Cependant pas aussi facile que je pensais .. Qu'est-ce que ce " [["chose? – Misha

+5

@Misha: la chose difficile à propos de strsplit est qu'il renvoie une liste. Cette "[[" chose est la fonction à extraire de cette liste. 2 est l'argument de cette fonction, ce qui signifie qu'elle prend le second élément des listes renvoyées par strsplit. Voir aussi? "[[" Dans R. et thx @rcs, c'est intelligent! –

+2

C'est un opérateur d'indexation. "[[" peut être utilisé pour sélectionner un seul élément en supprimant des noms, voir '? Extract'. Vous pouvez également utiliser "[". – rcs

7

C'est le même que la réponse de rcs, mais peut être plus facile à comprendre:

> sapply(strsplit(as.character(h$tes), "\\."), function(x) x[[2]]) 
[1] "abc" "di" "lik" 
+0

@all de vous ... Maintenant, je comprends. // M – Misha

9

Avec le paquet stringr il est encore plus facile:

library(stringr) 
str_split_fixed(h$tes, fixed("."), 2)[, 2] 
7

Cette question apparaît plusieurs fois sur StackOverflow.

En forme exacte que le vôtre:

Certaines questions similaires à ce sujet:

Et si vous vous souciez de vitesse alors vous devriez envisager tip from John answer about fixed parameter to strsplit.

1

Alternativement, 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"))))