R语言如何基于列表生成条件列名并逐行统计匹配次数
实现方案说明
你原来的代码有两个核心问题,导致无法得到预期结果:
- 用
event_data_consumer$i赋值时,R会默认创建/修改列名为固定值i的列,不会识别循环变量i存储的事件名 str_count的匹配参数写为'i'时,实际是匹配字符串里的小写字母i,不是循环对应的事件关键词
修正后的for循环写法
只需要调整动态列名的赋值方式、去掉匹配参数里多余的引号即可,注意R里动态给数据框加列不要用$运算符,要用[[ ]]索引:
library(stringr) # 加载str_count所属的工具包 events <- c('screen_view','cta','os_update') for (i in events) { event_data_consumer[[i]] <- str_count(event_data_consumer$event, pattern = i) }
运行后会自动在原表新增三列,列名分别是三个事件名,列值为对应行event字段里该事件的出现次数。
lapply实现(无需手写循环)
用lapply遍历待匹配事件列表批量计算,再一次性绑定到原表,代码更简洁:
library(stringr) events <- c('screen_view','cta','os_update') # 批量计算每个事件的匹配次数 count_list <- lapply(events, function(evt) { str_count(event_data_consumer$event, pattern = evt) }) # 给计算结果命名,和事件名一一对应 names(count_list) <- events # 列绑定到原数据表 event_data_consumer <- cbind(event_data_consumer, as.data.frame(count_list))
小提示:如果你的
event字段是多个事件用分隔符拼接的格式,怕出现短词误匹配(比如cta匹配到cta_click这类长词),可以给匹配规则加词边界,把pattern改成paste0("\\b", evt, "\\b")即可实现整词匹配。
内容的提问来源于stack exchange,提问作者Ellie S
相关产品推荐
相关产品推荐

