2017-09-14 1 views
1

Ce lien est de 90% de la façon de résoudre ce que je veux ne comprendre: R Split String By Delimiter in a columnR - Découper des chaînes dans une colonne sur un caractère et en gardant les résultats spécifiques

est ici l'entrée exemple:

A    B  C  
awer.ttp.net Code 554 
abcd.ttp.net Code 747 
asdf.ttp.net Part 554 
xyz.ttp.net  Part 747 

Et le résultat souhaité:

library(dplyr) 
df = df %>% mutate(D=gsub("\\..*","",A)) 

A B C D 
awer.ttp.net Code 554 awer 
abcd.ttp.net Code 747 abcd 
asdf.ttp.net Part 554 asdf 
xyz.ttp.net Part 747 xyz 

Mais cela ne vous donne la chaîne avant le premier point. Que faire si vous voulez ce qui suit?

A B C D 
awer.ttp.net Code 554 ttp 
abcd.ttp.net Code 747 ttp 
asdf.ttp.net Part 554 ttp 
xyz.ttp.net Part 747 ttp 

Répondre

1

Nous pouvons capturer en tant que groupe. Apparier un ou plusieurs caractères qui ne sont pas un . ([^.]+) depuis le début (^) de la chaîne suivi d'un . suivi d'un autre jeu de caractères qui ne sont pas un point capturé en tant que groupe (([^.]+)) suivi d'un autre caractère et remplacer par le backreference (\\1) du groupe capturé

library(dplyr) 
df1 %>% 
    mutate(D= sub("^[^.]+\\.([^.]+)\\..*", "\\1", A)) 
#    A B C D 
#1 awer.ttp.net Code 554 ttp 
#2 abcd.ttp.net Code 747 ttp 
#3 asdf.ttp.net Part 554 ttp 
#4 xyz.ttp.net Part 747 ttp 

Ou en utilisant extract

library(tidyr) 
df1 %>% 
    extract(A, into = 'D', "^[^.]+\\.([^.]+).*", remove = FALSE) 

Notez que nous ne avons pas besoin du dplyr pour cette

df1$D <- sub("^[^.]+\\.([^.]+)\\..*", "\\1", df1$A) 
0

Vous pouvez utiliser la fonction strsplit pour cela, et l'enrober dans une fonction qui renvoie la partie souhaitée.

Faites votre dataframe

temp <- "A    B  C 
awer.ttp.net Code 554 
abcd.ttp.net Code 747 
asdf.ttp.net Part 554 
xyz.ttp.net  Part 747 
" 
df <- read.table(textConnection(temp), header=TRUE, as.is=TRUE) 

Nous voulons utiliser la fonction strsplit, qui divise une chaîne à un modèle donné, et retourne une liste contenant un vecteur avec les différentes chaînes. Par exemple:

strsplit("A-B-C-D", "-") 
#[[1]] 
#[1] "A" "B" "C" "D" 

Wrap cela en une fonction qui renvoie une partie spécifiée

mystrsplit <- function(x, pattern, part=2){ 
    return(strsplit(x, pattern)[[1]][part]) 
} 
# Vectorize it so that it can handle vector arguments of x 
mystrsplit <- Vectorize(mystrsplit, vectorize.args = "x") 

Utilisez notre fonction mystrsplit en muter:

library(dplyr) 
df %>% mutate(D=mystrsplit(A, '\\.', 2)) 

#    A B C D 
#1 awer.ttp.net Code 554 ttp 
#2 abcd.ttp.net Code 747 ttp 
#3 asdf.ttp.net Part 554 ttp 
#4 xyz.ttp.net Part 747 ttp