使用 dplyr 从电子邮件变量生成用户变量?
generate user variable from email variable with dplyr?
我有一个如下所示的数据框:
df1 <-
structure(
list(email = c(
"user1@email.com", "user2@othermail.org"
)), class = "data.frame", .Names = "email", row.names = c(NA,-2L)
)
我想生成一个新变量,user
。我试过这个:
df2 <- df1 %>% mutate(user=strsplit(email, split = '@'))
但我希望 user 只是一个带有用户的字符变量,而不是带有 to 元素的列表。我该怎么做?
我们可以使用 separate
从 tidyr
library(dplyr)
library(tidyr)
separate(df1, email, into=c('user', 'com'),
sep="@", remove=FALSE) %>%
select(-com)
# email user
# 1 user1@email.com user1
# 2 user2@othermail.org user2
或者如@docendo discimus 所述,extract
也可以通过指定要提取的字符作为捕获组 ((.*)
) 中的新列,然后是所有其他要删除的字符来使用(即 @
和多个字符之一 (.*
))
extract(df1, email, "user", "(.*)@.*", remove = FALSE)
使用 OP 的代码,strsplit
输出将是 list
。如果需要从每个 list
元素中提取第一个元素,请使用 lapply
df1 %>%
mutate(user=lapply(strsplit(email, split = '@'),"[[", 1))
您也可以使用 base R,只需删除不需要的字符即可。
df1 <-
structure(
list(email = c(
"user1@email.com", "user2@othermail.org"
)), class = "data.frame", .Names = "email", row.names = c(NA,-2L)
)
df2 <- df1
df2$user <- gsub("@.*", "", df1$email)
df2
# email user
# 1 user1@email.com user1
# 2 user2@othermail.org user2
我们可以对您的原始代码进行小幅修改,只需选择从 strsplit
返回的每个列表的第一个元素:
df2 <- df1 %>% mutate(user=lapply(strsplit(email, split = '@'), "[", 1))
我有一个如下所示的数据框:
df1 <-
structure(
list(email = c(
"user1@email.com", "user2@othermail.org"
)), class = "data.frame", .Names = "email", row.names = c(NA,-2L)
)
我想生成一个新变量,user
。我试过这个:
df2 <- df1 %>% mutate(user=strsplit(email, split = '@'))
但我希望 user 只是一个带有用户的字符变量,而不是带有 to 元素的列表。我该怎么做?
我们可以使用 separate
从 tidyr
library(dplyr)
library(tidyr)
separate(df1, email, into=c('user', 'com'),
sep="@", remove=FALSE) %>%
select(-com)
# email user
# 1 user1@email.com user1
# 2 user2@othermail.org user2
或者如@docendo discimus 所述,extract
也可以通过指定要提取的字符作为捕获组 ((.*)
) 中的新列,然后是所有其他要删除的字符来使用(即 @
和多个字符之一 (.*
))
extract(df1, email, "user", "(.*)@.*", remove = FALSE)
使用 OP 的代码,strsplit
输出将是 list
。如果需要从每个 list
元素中提取第一个元素,请使用 lapply
df1 %>%
mutate(user=lapply(strsplit(email, split = '@'),"[[", 1))
您也可以使用 base R,只需删除不需要的字符即可。
df1 <-
structure(
list(email = c(
"user1@email.com", "user2@othermail.org"
)), class = "data.frame", .Names = "email", row.names = c(NA,-2L)
)
df2 <- df1
df2$user <- gsub("@.*", "", df1$email)
df2
# email user
# 1 user1@email.com user1
# 2 user2@othermail.org user2
我们可以对您的原始代码进行小幅修改,只需选择从 strsplit
返回的每个列表的第一个元素:
df2 <- df1 %>% mutate(user=lapply(strsplit(email, split = '@'), "[", 1))