R如果行中的条件,则为新列赋值 - lappy / ifelse / for循环

时间:2018-02-07 17:40:12

标签: r for-loop if-statement lapply

我一直在寻找一个不错的答案,在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然而我无法成功

1 个答案:

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