1
votes

Conserver les observations dans l'ensemble de données avec une certaine chaîne - R

J'essaye de faire ce qui suit:

J'ai:

v2 <- unlist(as.person(v1)$email)

#which would give me: 

v2 <- c("personsemail@email.com", "person2@email.com","randomname@email.com")

#but I want a data frame of all the elements in v2 that are included in v1 such that: 

df <- data.frame(v1=c("Persons Name <personsemail@email.com>",
"person 2 <person2@email.com>",
"Random Name <randomname@email.com>"), 
v2=c("personsemail@email.com", "person2@email.com",
"randomname@email.com")

(cette variable a des centaines d'observations)

Je veux pour éventuellement créer une deuxième variable qui extrait leur e-mail et uniquement des observations avec l'e-mail qui crée une trame de données des éléments suivants:

v1 <- c("Persons Name <personsemail@email.com>","person 2 <person2@email.com>","person4",NA,"person5","Random Name <randomname@email.com>")

Remarque: il existe de nombreuses autres variables dans l'ensemble de données aussi.


0 commentaires

4 Réponses :


2
votes

Je pense que c'est ce que vous recherchez:

library(stringr)

df <- data.frame(v1 = c("Persons Name <personsemail@email.com>","person 2 <person2@email.com>","person4",NA,"person5","Random Name <randomname@email.com>"), 
                 stringsAsFactors = FALSE)

df$v2 <- str_extract(df$v1, "<(.*)>")          #Extracts text from "<" through ">"
df$v2 <- str_replace_all(df$v2 , c("<|>"), "") #Replaces "<" or ">" with ""
df    <- na.omit(df)                           #Omits's rows with NA from the entire df. Use a different approach if you have NA in OTHER columns.

#                                     v1                     v2
#1 Persons Name <personsemail@email.com> personsemail@email.com
#2          person 2 <person2@email.com>      person2@email.com
#6    Random Name <randomname@email.com>   randomname@email.com


0 commentaires

0
votes

Si vous pouvez exclure les entrées "NA", vous pouvez utiliser les

df <- as.data.frame(v1)
df$v2 <- as.person(v1)$email

suivants


0 commentaires

3
votes

Vous pouvez sous-définir v1 d'abord avec ! is.na (v1) , puis sous-définir avec ! sapply (v2, is.null) code > pour obtenir ceux où vous avez un e-mail.

inds <- regexpr(pattern = "<(.*@.*\\..*)>", v1)
v2 <- ifelse(inds > 1, substring(v1, inds + 1, inds + attr(inds, "match.length") - 2), NA)
df <- data.frame(v1, v2)
df <- df[!is.na(df$v2),]

ou l'inverse

v2 <- as.person(v1)
df <- data.frame(v1=as.character(v2), v2=as.character(v2$email))
df <- df[df$v2!="NULL",]

ou

v2 <- as.person(v1)
(df <- data.frame(v1=format(v2), v2=format(v2, "email")))
#                                     v1                       v2
#1 Persons Name <personsemail@email.com> <personsemail@email.com>
#2          person 2 <person2@email.com>      <person2@email.com>
#3                               person4                         
#4                               person5                         
#5    Random Name <randomname@email.com>   <randomname@email.com>

(df <- df[df$v2!="",])
#                                     v1                       v2
#1 Persons Name <personsemail@email.com> <personsemail@email.com>
##2          person 2 <person2@email.com>      <person2@email.com>
#5    Random Name <randomname@email.com>   <randomname@email.com>

Ou vous utilisez le formulaire de solution @db à votre première question.

v2 <- as.person(v1)$email
cbind(v1[!is.na(v1)][!sapply(v2, is.null)], unlist(v2))
#     [,1]                                    [,2]                    
#[1,] "Persons Name <personsemail@email.com>" "personsemail@email.com"
#[2,] "person 2 <person2@email.com>"          "person2@email.com"     
#[3,] "Random Name <randomname@email.com>"    "randomname@email.com"  


0 commentaires

1
votes

Une option consiste également à définir les noms de la sortie list de as.person avec le NA supprimé 'v1' ( na.omit ) et le transformer en deux colonnes data.frame avec stack

v2 <- na.omit(v1)
stack(setNames(as.person(v2)$email, v2))[2:1]
#                               ind                 values
#1 Persons Name <personsemail@email.com> personsemail@email.com
#2          person 2 <person2@email.com>      person2@email.com
#3    Random Name <randomname@email.com>   randomname@email.com


0 commentaires