我一直在寻找一个不错的答案,在Python中,for循环可以在几秒钟内解决这个问题。 我有大约100K的URL,我试图根据它们包含的特定字符串对它们进行分组,我已经看到了很多类似的例子,但是没有什么是我需要的。 最流行的答案是使用ifelse,这在我的情况下不起作用,因为我使用长列表,如果有“if”选项我会接受它(与ifelse相反)
可重复的代码
list<-c("birthday","anniv")
myData <-data.frame(URL = c("/birthday/promoid:654654","/birthday/products/","/anniversary","/anniversary/?type=gifts","/celebration","/celebration"), PageView=1:6*515)
然后我想创建一个名为“occasion”的新列,这样我就可以对URL进行分组并期望以下
myData$occasion<-ifelse(grepl("birthday", myData$URL),"birthday",
ifelse(grepl("anniv", myData$URL),"anniv",
ifelse(grepl("anniv", myData$URL),"anniv","NA")
)
)
URL PageView occasion
1 /birthday/promoid:654654 515 birthday
2 /birthday/products/ 1030 birthday
3 /anniversary 1545 anniv
4 /anniversary/?type=gifts 2060 anniv
5 /celebration 2575 NA
6 /celebration 3090 NA
这里我使用了嵌套的ifelse,但由于关键字列表将达到10K,因此不可行 我已经研究了lapply但没有成功,因为我根本不知道如何将值赋给新列
lapply(list, function(list)
sub(paste0(".*",list,".*"),list, myData$URL, ignore.case = TRUE)
)
因为这给了我一个清单
myData$Occasion<- lapply(list, function(list)
sub(paste0(".*",list,".*"),list, myData$URL, ignore.case = TRUE)
)
*编辑:我正在寻找一个不涉及for循环的解决方案,因为我一直被告知这是非常低效的事情。我在思考lapply然而我无法成功
答案 0 :(得分:2)
为什么不只是两个单独的grep
语句而不是嵌套的if-elses?这个表现得足够快吗?
myData$tag <- NA
myData$tag[grep("birthday", myData$URL)] <- "birthday"
myData$tag[grep("anni", myData$URL)] <- "anniversary"
或者,为了一点灵活性和代码高尔夫,集体:
for (s in mytags) myData$tag[grepl(s,myData$URL)] <- s