在特定列中与 grepl 匹配的模式后过滤行

Filter rows after pattern matched with grepl in certain column

我有一个数据集(名为 desktop),其中包含来自网络跟踪器的按时间顺序排列的信息,该网络跟踪器在一列中包含不同用户访问过的 URLs 和另一列中的用户 ID。为了搜索引擎分析的目标,我试图过滤所有包含 URL 的行,其中用户向 google 提交了搜索查询,我可以使用以下代码行来完成:

data_google <- dplyr::filter(desktop, grepl('\bgoogle.com/search\b', desktop$url, ignore.case = T))

这很好用。但是,我不仅对包含搜索查询的 URL 感兴趣,而且对用户在提交查询后访问的网页感兴趣。换句话说,用户实际点击的 google 结果页面中的 link。

是否可以不仅过滤 url 与模式匹配的行,还可以过滤紧随其后的行?

任何帮助将不胜感激,谢谢

您说信息是按时间顺序排列的,所以这样做的方法是简单地提取用户每次搜索的下一条记录。下面的代码就是这样做的

#assign proper row index column
desktop$row_index <- 1:nrow(desktop) 
data_google <- dplyr::filter(desktop, grepl('\bgoogle.com/search\b', desktop$url, ignore.case = T))

data_google 中的行对应于 google 搜索 url。要获得访问过的 url 用户(大概是 google 搜索中的结果),您基本上会从桌面上获取最小值 row_index 的行,即搜索 url 之后,但在下一次搜索之前 url.

names(data_google) <- c("search_url","user_id","search_row_index")
temp <- merge(desktop, data_google, by = "user_id")
temp <- temp[order(temp$user_id),]
#from temp, remove the rows with search_row_index >= row_index, since we are interested in url AFTER the search
temp <- temp[which(! temp$search_row_index >= temp$row_index),]
#now for each user and search_row_index, simply take the row with minimum row_index, 
#that would be the very next url visited after each of the search by the user
right_after_search_data <- as.data.frame(temp %>% 
                                         group_by(user_id,search_row_index) %>% 
                                         filter(row_index==min(row_index)))

以鸢尾花数据集为例。我将推入所有以 'set' 开头的物种,然后得到它后面的行。这是一个非常简单的示例,但在您的情况下应该可以实现您的目标。

vec1 <- which(grepl("set", iris$Species))

vec2 <- vec1+1
vec3 <- unique(c(vec1,vec2))

iris[vec3,]

如果您在组内需要,请编辑下面的解决方案。我使用钻石数据集进行排序以模仿您的顺序,然后按切割分组并找到颜色包含 'E' 的位置然后您可以在第一个标志变量上使用 lag 来获取它之后的行并且它尊重 group_by()

diamonds2 <- diamonds %>% 
             arrange(cut) %>% 
             group_by(cut) %>%
            mutate(
                   fl = ifelse(rownm %in% which(grepl("E",color)),1,0 ),
                   fl2 = lag(fl)) %>% 
            filter(fl ==1 | fl2 ==1
                    )