【问题标题】:Checking if phrase contains a certain word检查短语是否包含某个单词
【发布时间】:2018-01-04 09:08:12
【问题描述】:

我有一列包含随机名称。我想创建一个代码来创建另一个列(使用 mutate 函数)来检查名称是否包含“先生”这个词。这将导致新列生成“男性”

【问题讨论】:

标签: r dplyr


【解决方案1】:

使用 dplyr 和 stringr:

library(stringr)
library(dplyr)

df <- data.frame(name = c("Mr. Robinson", "Mrs. robinson", "Gandalf","asdMr.dfa"))

df <- df %>% mutate(male = ifelse(str_detect(df$name, fixed("Mr.")), TRUE, FALSE))

输出:

> df
           name  male
1  Mr. Robinson  TRUE
2 Mrs. robinson FALSE
3       Gandalf FALSE
4     asdMr.dfa  TRUE

请注意,这与短语“先生”相匹配。字符串中的任何位置,而不仅仅是开头。如果你不想这样,我会使用正则表达式:

df <- df %>% mutate(male = ifelse(str_detect(name, "^Mr\\."), TRUE, FALSE))
> df
           name  male
1  Mr. Robinson  TRUE
2 Mrs. robinson FALSE
3       Gandalf FALSE
4     asdMr.dfa FALSE

这也可以在没有 stringr 包的情况下实现:(受@akrun 启发)

df <- df %>% mutate(male = ifelse(grepl("^Mr\\.", name), TRUE, FALSE))

编辑:

@docendo discimus 指出 ifelse() 不是必需的,因为我们正在创建一个逻辑列,而这正是 grepl 返回的内容。所以:

df <- df %>% mutate(male = grepl("^Mr\\.", name))

没有 dplyr:

df <- transform(df, male = grepl("^Mr\\.", name))

【讨论】:

  • 如果您只返回逻辑真/假,则不需要ifelse,因为这就是grepl 返回的内容。就此而言,您也不需要 dplyr。它可能只是transform(df, male = grepl("^Mr\\.", name))
  • 嘿酷,我不知道!不过很有意义,谢谢
猜你喜欢
  • 1970-01-01
  • 2018-04-17
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
相关资源
最近更新 更多