从单独的数据框

时间:2017-04-24 20:36:04

标签: r tokenize

我在下面有一些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)

1 个答案:

答案 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$KEYWORDstr_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