【问题标题】:dplyr mutate stringr str_detect with multiple conditional arguments and corresponding outputdplyr mutate stringr str_detect 具有多个条件参数和相应的输出
【发布时间】:2018-08-11 07:49:09
【问题描述】:

我想根据格式对字符串进行不同的变异。此示例基于包含某些标点符号有 2 种格式。向量的每个元素都包含与格式唯一关联的特定单词。

我用 ifelse 和 casewhen 尝试了多种方法,但没有得到想要的结果,即“保留”字符串的最后一部分。

我正在尝试使用简单的动词,但不精通 grex。接受任何关于有效通用方法的建议。

library(dplyr)
library(stringr)
df <- data.frame(KPI = c("xxxxx.x...Alpha...Keep.1",
                     "xxxxx.x...Alpha..Keep.2",
                     "Bravo...Keep3",
                     "Bravo...Keep4",
                     "xxxxx...Charlie...Keep.5",
                     "xxxxx...Charlie...Keep.6"))

dot3dot3split <- function(x) strsplit(x,  "..." , fixed = TRUE)[[1]][3]
dot3dot3split("xxxxx.x...Alpha...Keep.1") # returns as expected
"Keep.1"

dot3split <- function(x) strsplit(x,  "..." , fixed = TRUE)[[1]][2]
dot3split("Bravo...Keep3") # returns as expected
"Keep3"

df1 <- df %>% mutate_if(is.factor, as.character) %>%
        mutate(KPI.v2 = ifelse(str_detect(KPI, paste(c("Alpha", "Charlie"), collapse = '|')), dot3dot3split(KPI), 
                               ifelse(str_detect(KPI, "Bravo"), dot3split(KPI), KPI))) # not working as expected

df1$KPI.v2 “Keep.1” “Keep.1” “Alpha” “Alpha” “Keep.1” “Keep.1”

【问题讨论】:

    标签: r if-statement stringr dplyr


    【解决方案1】:

    您设计的函数(dot3dot3splitdot3split)无法矢量化操作。例如,如果有多个元素,则仅返回第一个。这可能会导致一些问题。

    dot3dot3split(c("xxxxx.x...Alpha...Keep.1", "xxxxx.x...Alpha..Keep.2"))
    # [1] "Keep.1" 
    

    由于你使用的是,我建议你可以使用str_extract来提取你想要的字符串,而不是使用ifelse或者可以进行向量化操作的函数。

    df <- data.frame(KPI = c("xxxxx.x...Alpha...apples",
                             "xxxxx.x...Alpha..bananas",
                             "Bravo...oranges",
                             "Bravo...grapes",
                             "xxxxx...Charlie...cherries",
                             "xxxxx...Charlie...guavas"))
    
    library(dplyr)
    library(stringr)
    
    df1 <- df %>%
      mutate_if(is.factor, as.character) %>%
      mutate(KPI.v2 = str_extract(KPI, "[A-Za-z]*$"))
    df1
    #                          KPI   KPI.v2
    # 1   xxxxx.x...Alpha...apples   apples
    # 2   xxxxx.x...Alpha..bananas  bananas
    # 3            Bravo...oranges  oranges
    # 4             Bravo...grapes   grapes
    # 5 xxxxx...Charlie...cherries cherries
    # 6   xxxxx...Charlie...guavas   guavas
    

    【讨论】:

    • 但我不想检测 Keep,而是检测 Alpha Bravo 和 Charlie,然后检测 Keep。我在这里遇到的问题是strong中有不同的格式,但是向量的元素包含与每种格式唯一关联的特定单词。
    • @MichaelBellhouse 我不清楚你想要什么。请分享您想要的输出。
    • 对不起,我不清楚。在我的示例中,每条记录的“保留”组件可能不同。所以 Keep.1 可能是苹果,Keep.2 “香蕉”,Keep.3 “橙子”(我应该在我的例子中使用它,但使用“Keep”来标注我想要保留的部分。我可以重写以这种方式请求是否会更好。但是,正如您在我最初的尝试中看到的那样,我搜索了字符串的 (str_detect) Alpha 或 Bravo 或 Charlie 部分,以提取所需字符串的相应部分。我希望这有助于澄清,感谢您花时间和兴趣帮助我。
    • @MichaelBellhouse 请查看我的更新。我根据您的描述创建了一个示例数据框并更新了我的正则表达式代码。
    • 不客气。我再次更改了正则表达式以使其更简洁。这是一个我认为可能对学习 R 中的正则表达式有用的链接 (uc-r.github.io/regex)。
    猜你喜欢
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多