r - `str_detect()` 和 `map()` 遍历许多字符串检测
问题描述
我的数据格式如下。(最后的数据输入代码,下面的问题)。
#> df
#> id amount description
#> 1 10 electricity
#> 2 100 rent
#> 3 4 fees
我希望能够根据描述中是否包含某些字符串对事务(行)进行分类。
例如:
library(tidyverse)
df <- df %>%
mutate(category = ifelse(str_detect(description, "elec"), "bills", description))
这使:
#> id amount description category
#> 1 1 10 electricity bills
#> 2 2 100 rent
#> 3 3 4 fees
我希望能够定义关键字向量和相关类别,如下所示:
keywords <- c(electric = "bills",
rent = "bills",
fees = "misc")
下一步如何创建具有正确标签的类别列?
期望的输出:
#> id amount description category
#> 1 1 10 electricity bills
#> 2 2 100 rent bills
#> 3 3 4 fees misc
我试过map2_df
了,但我一定做错了,因为下面的代码创建了三个版本的 df 堆叠在一起:
categorise_transactions <- function(keyword, category){df <- df %>%
mutate(category = ifelse(str_detect(description, keyword), category, description))}
library(purrr)
map2_df(names(keywords), keywords, categorise_transactions)
数据输入代码如下:
df <- data.frame(
stringsAsFactors = FALSE,
id = c(1L, 2L, 3L),
amount = c(10L, 100L, 4L),
description = c("electricity", "rent", "fees")
)
df
解决方案
str_replace_all
几乎可以满足您的需求:
library(dplyr)
library(stringr)
str_replace_all(df$description, keywords)
#[1] "billsity" "bills" "misc"
但是,正如@Russ Thomas 所建议的那样,case_when
它正是您所需要的。
library(dplyr)
library(stringr)
df %>%
mutate(category = case_when(str_detect(description, 'electric') ~ 'bills',
str_detect(description, 'rent') ~ 'bills',
str_detect(description, 'fees') ~ 'misc'))
# id amount description category
#1 1 10 electricity bills
#2 2 100 rent bills
#3 3 4 fees misc
推荐阅读
- pyspark - 在其他列上按条件限制 pyspark 列?
- angular - cdkStepLabel - ng 模板 - innerHTML
- sql - 多个 UNION 返回杂乱的结果
- solr - 索引 solr 数据时无法修剪尾随空格?
- javascript - 在函数中使用 getElementsByClassName 选择所有元素,不起作用
- c - 如何在 macOS 上使用 Mach 内核设置主机异常端口?
- arrays - 如何连接()多个数组并检查值是否已经存在
- java - ArrayList 上使用的 Stream API reduce 未同步
- django - Django - 如何使用 CreateView 扩展自定义用户
- python - pandas - 在我的 df 中只保留那些在 df.index 和 df.columns 中常见的列名