r语言 - 使用 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 = '@'))

但我希望用户只是用户的字符变量,而不是带有 to 元素的列表。我该怎么做?

您也可以使用基本 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

我们可以使用 tidyr 中的separate

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

或者正如 discimus 提到的@docendo,也可以通过将要提取的字符指定为捕获组中的新列来使用extract(.*) ),然后是要删除的所有其他字符(即 @和多个字符之一(.*))

extract(df1, email, "user", "(.*)@.*", remove = FALSE) 

使用 OP 的代码,strsplit输出将是一个list。 如果需要从每个list元素中提取第一个元素,请使用lapply

 df1 %>%
    mutate(user=lapply(strsplit(email, split = '@'),"[[", 1))

我们可以通过选择从strsplit返回的每个列表的第一个元素来对您的原始代码进行小的修改:

df2 <- df1 %>% mutate(user=lapply(strsplit(email, split = '@'), "[", 1))

最新更新