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.
4 Réponses :
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
Si vous pouvez exclure les entrées "NA", vous pouvez utiliser les
df <- as.data.frame(v1) df$v2 <- as.person(v1)$email
suivants
Vous pouvez sous-définir ou l'inverse ou Ou vous utilisez le formulaire de solution @db à votre première question. 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),]
v2 <- as.person(v1)
df <- data.frame(v1=as.character(v2), v2=as.character(v2$email))
df <- df[df$v2!="NULL",]
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>
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"
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