我在下面有一些R代码,其中包含我正在使用的2个数据帧的示例。 "关键字" df是定期更改的,所以我需要创建一些代码来标记" mydata"中的行。 Segment匹配的位置和mydata $ Acct_Name只需要在单元格中的某个位置包含关键字$ KEYWORD中的单词。
我开始做一个FOR循环,但当你处理grepl和多个数据帧时,事情变得很棘手。我的下一个想法是解析mydata $ Acct_Name然后尝试在两个dfs之间进行合并。
非常感谢任何帮助!
Acct_Name <- c('joes ski shop'
,'joes alarm shop'
,'joes alarm spot'
,'joes bakery'
,'joes albergue shop'
,'jims Brewery'
,'jims albergue place'
)
Segment <- c('All_Other'
,'All_Other'
,'All_Other'
,'All_Other'
,'Apartments'
,'Apartments'
,'Apartments'
)
mydata <- data.frame(Acct_Name, Segment)
mydata$Acct_Name <- as.character(mydata$Acct_Name)
mydata$Segment <- as.character(mydata$Segment)
Segment <- c('All_Other'
,'All_Other'
,'All_Other'
,'Apartments'
,'Apartments'
,'Apartments'
,'Apartments'
)
KEYWORD <- c('aislamiento'
,'alarm'
,'alarma'
,'albergue'
,'alcantarilla cloaca'
,'alcohol'
,'almacenamiento'
)
keywords <- data.frame(Segment,KEYWORD)
keywords$FLAG <- 1
keywords$Segment <- as.character(keywords$Segment)
keywords$KEYWORD <- as.character(keywords$KEYWORD)
答案 0 :(得分:1)
您想在mydata
中为该群组的条目中找到该群组的任何关键字。我们基本上可以使用or
将每个组折叠为一个paste
条件,并指定collapse = "|"
。然后进行合并,并使用grepl
创建一个新的结果列。使用data.table
:
library(data.table)
# make the conditions, collapsing by group
kwords <- as.data.table(keywords)[, KWORD := paste(KEYWORD, collapse = "|"), by = Segment
][, .SD[1], by = Segment, .SDcols = c("KWORD")]
# make a column based on the grepl with condition
mydata <- as.data.table(mydata)
kwords[mydata, on = "Segment"][, flag := grepl(KWORD, Acct_Name), by = Acct_Name][]
# output:
# Segment KWORD Acct_Name flag
# 1: All_Other aislamiento|alarm|alarma joes ski shop FALSE
# 2: All_Other aislamiento|alarm|alarma joes alarm shop TRUE
# 3: All_Other aislamiento|alarm|alarma joes alarm spot TRUE
# 4: All_Other aislamiento|alarm|alarma joes bakery FALSE
# 5: Apartments albergue|alcantarilla cloaca|alcohol|almacenamiento joes albergue shop TRUE
# 6: Apartments albergue|alcantarilla cloaca|alcohol|almacenamiento jims Brewery FALSE
# 7: Apartments albergue|alcantarilla cloaca|alcohol|almacenamiento jims albergue place TRUE
编辑:
另一个选项可能在每个组有很多关键字时起作用,使用stringr::str_detect
,它是在模式上进行矢量化的。像这样:
as.data.table(mydata)[, flag := any(
stringr::str_detect(Acct_Name,
keywords[keywords$Segment == Segment,"KEYWORD"])),
by = Acct_Name][]
# Acct_Name Segment flag
# 1: joes ski shop All_Other FALSE
# 2: joes alarm shop All_Other TRUE
# 3: joes alarm spot All_Other TRUE
# 4: joes bakery All_Other FALSE
# 5: joes albergue shop Apartments TRUE
# 6: jims Brewery Apartments FALSE
# 7: jims albergue place Apartments TRUE
我们希望查看keywords
的子集是否可以keywords$Segment == mydata$Segment
找到来自any
的模式的keywords$KEYWORD
,str_detect
mydata$Acct_Name
。这个解决方案对我来说似乎有点时髦,因为它混合了一些引用列的不同方法并混合了data.frame和data.table,但它似乎有效。也许这将适用于原始数据的大小。
或者,不必重复进行子集,而是事先制作一个列表并使用它(使用split
拆分data.frame,相当于此处的子集,而lapply
只获取{ {1}}列):
KEYWORD
然后通过mydata中的keywords.list <- lapply(split(keywords, keywords$Segment), function(x) x$KEYWORD)
值
Segment