r - 将所有内容都放在 ? 的左侧在带有 mutate 的 dplyr 链期间的字符串中

标签 r stringr

df <- data.frame(
  strings = c('blah?ha', 'foo?bar', 'cats?dogs')
)

df %>% 
  mutate(first_word = str_split(strings, fixed('?')))

     strings first_word
 strings first_word
1   blah?ha   blah, ha
2   foo?bar   foo, bar
3 cats?dogs cats, dogs

这让我更接近我的目标。我只想要第一部分,废话,foo和猫。尝试过:

 df %>% 
+   mutate(first_word = str_split(strings, fixed('?'))[[1]][[1]])
    strings first_word
1   blah?ha       blah
2   foo?bar       blah
3 cats?dogs       blah

这让我在该列中重复了相同的单词。

如何获得包含 blah、foo 和 cats 值的新列?

最佳答案

我们可以使用 str_extract 从一开始就匹配一个或多个不是 ? ([^?]+) 的字符 ( ^) 的字符串

library(dplyr)
library(stringr)
df %>%
   mutate(first_word = str_extract(strings, "^[^?]+"))

或者使用 trimwswhitespace 作为正则表达式

df %>%
    mutate(first_word = trimws(strings, whitespace = "\\?.*"))

base R中的类似代码

df$first_word <- with(df, trimws(strings, whitespace = "\\?.*"))

OP 代码中的问题是它仅从 str_split 中提取第一个 list 元素 ([[1]])。它需要循环 list 并获取 first 元素

library(purrr)
df %>%
    mutate(first_word = map_chr(str_split(strings, fixed("?")), first))
#    strings first_word
#1   blah?ha       blah
#2   foo?bar        foo
#3 cats?dogs       cats    

关于r - 将所有内容都放在 ? 的左侧在带有 mutate 的 dplyr 链期间的字符串中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66464408/

相关文章:

r - 如何在R中获取变量的环境

r - 如何按组回归线性模型并且仅改变斜率但保持截距相同?

r - 通过 R 中其他 2 列的所有组合计算一列的平均值

regex - stringr 包中的 Perl 正则表达式

r - 如何模糊匹配r中的两个字符向量

r - R和Stata中的一阶线性线性面板模型方差

python - 在Python中加载xgboost模型,该模型由R中的 `xgboost::save()`保存

r - 如何抓取 "-"之后的一些字符?

r - stringr 相当于 grep

r - str_extract : Extracting exactly nth word from a string