【发布时间】:2020-11-02 13:33:31
【问题描述】:
我想遍历包含类别的表,以将子类别分配给另一个名为“数据”的数据框中的列。文本是一个人手写的,是一个包含大约 100 个单词的字符字段,但长度是动态的。我想检查'search_pat'中提供的单词是否在'text'字段中,如果是并且'category'也匹配,则必须分配subcat。我在下面的代码中执行的应用功能为我提供了结果:
"cat1" "cat2"
但我想要的结果是相同的数据框“数据”,但随后为“子猫”列填充了值(如果适用)。
我真正的“数据”数据框是 400.000 行,类别表现在大约 100 行,但将来会扩展。我使用 for 循环进行了此操作,但对我来说这似乎效率很低。我的目标是让代码更高效。
请参阅下面提供的示例。
# Create example data
data <- data.frame('text' = rep(c('blabla FOO blabla', 'blabla test','bla BAR blablabla', 'test BOO blabla'),2),
'category' = c('X', 'Y', 'Z', 'X', 'X', 'X', 'X', 'Z'),
'subcat' = rep(NA, 8))
categories <- data.frame('search_pat' = c('FOO', 'BAR', 'BOO', 'BOO'),
'category' = c('X', 'Z', 'X', 'Z'),
'subcat' = c('cat1', 'cat2', 'cat3', 'cat4'))
# Function for assigning the subcategory to the data
assign_subcat <- function(df, searchterm, category, subcat){
bool_mask <- (grepl(searchterm, df$text) & (df$category == category))
df$subcat[bool_mask] <- subcat
}
# Loop over the categories dataframe to assign subcategory on the data
apply(categories, MARGIN = 1, FUN = function(x) assign_subcat(df = data,
x['search_pat'],
x['category'],
x['subcat']))
# Desired result
text category subcat
1 blabla FOO blabla X cat1
2 blabla test Y NA
3 bla BAR blablabla Z cat2
4 test BOO blabla X cat3
5 blabla FOO blabla X cat1
6 blabla test X NA
7 bla BAR blablabla X NA
8 test BOO blabla Z cat4
【问题讨论】:
标签: r dataframe join dplyr stringr