dplyr mutate stringr str_detect,带有多个条件参数和相应的输出

问题描述 投票:0回答:1

我想以不同的方式改变字符串,具体取决于格式。此示例基于包含某些标点符号的格式有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 dplyr stringr mutate
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.