检查R中的列效率不高,速度太慢。是否有更快的功能选项';互动';?

检查R中的列效率不高,速度太慢。是否有更快的功能选项';互动';?,r,csv,R,Csv,我有一个CSV文件作为 h、 csv 我有另一个CSV文件作为 georeportrecord.csv Campaign,Adgroup sad,ur return,reer 期望输出 Identity,CampaignName,AdGroupName,State,City,CampaignDuplicate,AdGroupDuplicate 344,return,wewe,utah,los,Yes,No 613,tere,ree,tyt,dlms,No,No 6566,sad,ur,ds,p

我有一个CSV文件作为

h、 csv

我有另一个CSV文件作为

georeportrecord.csv

Campaign,Adgroup
sad,ur
return,reer
期望输出

Identity,CampaignName,AdGroupName,State,City,CampaignDuplicate,AdGroupDuplicate
344,return,wewe,utah,los,Yes,No
613,tere,ree,tyt,dlms,No,No
6566,sad,ur,ds,pol,Yes,Yes
我正在对照两个CSV文件检查第一个文件的活动和广告组是否存在于第二个文件中。如果存在,则为是,否则为否

我的代码是

Campaigns <- georeportrecord$Campaign
AdGroups <- interaction(georeportrecord$Campaign, georeportrecord$Adgroup)
h$CampaignDuplicate <- ifelse(h$CampaignName %in% Campaigns,"YES","NO")
h$AdGroupDuplicate <- ifelse(interaction(h$CampaignName,h$AdGroupName) %in% AdGroups,"YES","NO")

活动这里有一个使用
data.table
的解决方案。我还没有测试过,但我认为它应该可以工作

require(data.table)
## Convert to data.table
Campaigns <- data.table(georeportrecord$Campaign)
AdGroups <- data.table(interaction(georeportrecord$Campaign, georeportrecord$Adgroup))

## Sort table and allow binary searching
setkey(Campaigns,V1) 
setkey(AdGroups,V1)

## Binary Search
h$CampaignDuplicate <- ifelse(h$CampaignName %in% Campaigns$V1,"YES","NO")
h$AdGroupDuplicate <- ifelse(interaction(h$CampaignName,h$AdGroupName) %in% AdGroups$V1,"YES","NO")
require(data.table)
##转换为data.table

活动我认为您不需要调用
交互

在这里使用data.table二进制搜索/连接功能将起作用

首先制作表格(您只需像我一样将文件名放在
read.csv
而不是
text=
):

然后,无论
h
的活动列位于
georeport
中,都将
activityduplicate
设置为T

h[georeport, CampaignDuplicate:=T]
#    Identity CampaignName AdGroupName State City CampaignDuplicate
# 1:      344       return        wewe  utah  los              TRUE
# 2:     6566          sad          ur    ds  pol              TRUE
# 3:      613         tere         ree   tyt dlms             FALSE
对AdGroupDuplicate执行几乎相同的操作,但只需将键设置为(Campaign,AdGroup)列的组合:

setkey(georeport, Campaign, Adgroup)
setkey(h, CampaignName, AdGroupName)
h[, AdGroupDuplicate:=F]
h[georeport, AdGroupDuplicate:=T]
#    Identity CampaignName AdGroupName State City CampaignDuplicate AdGroupDuplicate
# 1:      344       return        wewe  utah  los              TRUE            FALSE
# 2:     6566          sad          ur    ds  pol              TRUE             TRUE
# 3:      613         tere         ree   tyt dlms             FALSE            FALSE

有很多重复的活动吗?有多少个重复的Campaign x Adgroup组合?@DavidRobinson在georReportRecord.csv中有超过200000个CampaignName和AdGroupName组合,是的,有很多重复的Campaign,所以它是针对每个案例进行检查的。对吗?我想你可以使用
data.table
包进行二进制搜索来加快搜索过程。@wetfeets:嘿,你的建议在哪里,你删除了吗?@user3188390我正在编辑它,对不起。好吧,让我测试一下。h$campaigname%chin%Campaigns$V1:x中的错误类型为“integer”(必须为“字符”或空)它应该是%in%而不是%chin%您有数字活动名称吗?如果有,您必须使用%in%来代替。您实际上没有在那里进行二进制搜索。感谢您的帮助,但这与我希望的结果略有不同,如示例中所述,如果存在活动名称,而此时不存在adgroupname它应该为campaignname指示YES,为AdGroupname指示NO,从某种意义上说,只有在它看到campaignname是否存在之后,它才会检查AdGroupname。AdGroupDuplicate列与您希望的列相同。我没有意识到您也需要CampaignDuplicate列的代码(在您的问题中,您说您正在检查CSV文件,以查看“第一个文件的活动和广告组是否存在于第二个文件中”,它只描述了您的AdGroupDuplicate列,而不是CampaignDuplicate列。无论如何,我为您更新了这两个列的代码。非常感谢您的帮助,感谢您的关注和快速回复。
setkey(georeport, Campaign)
setkey(h, CampaignName)
h[, CampaignDuplicate:=F]
h[georeport, CampaignDuplicate:=T]
#    Identity CampaignName AdGroupName State City CampaignDuplicate
# 1:      344       return        wewe  utah  los              TRUE
# 2:     6566          sad          ur    ds  pol              TRUE
# 3:      613         tere         ree   tyt dlms             FALSE
setkey(georeport, Campaign, Adgroup)
setkey(h, CampaignName, AdGroupName)
h[, AdGroupDuplicate:=F]
h[georeport, AdGroupDuplicate:=T]
#    Identity CampaignName AdGroupName State City CampaignDuplicate AdGroupDuplicate
# 1:      344       return        wewe  utah  los              TRUE            FALSE
# 2:     6566          sad          ur    ds  pol              TRUE             TRUE
# 3:      613         tere         ree   tyt dlms             FALSE            FALSE