如何在R中更高效使用stringr与forcats包开展流水线数据分析
问题1:stringr与dplyr流水线衔接方案
stringr的函数完全可以嵌入dplyr的管道流程,不需要单独赋值列或者强制转换为单列处理,配合mutate()函数即可实现全流程串联,针对不同场景有对应写法:
单列处理示例(对应你的演示代码)
# 加载所需包 library(dplyr) library(stringr) # 生成测试数据 name <- c('D', 'E', 'F', 'G', 'd', 'e', 'f' ) room <- rep(c('A','B'),c(4,3)) goal <- c(rnorm(7,mean=60,sd=10)) test <- data.frame(name,goal,room) # 管道流式处理:替换字符后直接分组汇总 test %>% mutate(name = str_replace(name, 'G', 'H')) %>% # 直接在mutate里调用stringr函数处理指定列 group_by(name) %>% summarise(total_goal = sum(goal))
多列批量处理示例
如果需要对多列字符串做统一处理,用across()即可,无需拆分数据集:
test %>% # 对所有字符列统一做小写转换 mutate(across(where(is.character), ~str_to_lower(.x))) %>% group_by(name) %>% summarise(total_goal = sum(goal))
需折叠为单列处理的场景
如果业务要求必须先把多列转为单列做字符串处理,可配合tidyr的长宽转换函数在同一条管道内完成流转,不需要中间赋值:
library(tidyr) test %>% pivot_longer(cols = c(name, room), names_to = "col_type", values_to = "str_val") %>% mutate(str_val = str_to_upper(str_val)) %>% # 对折叠后的所有字符串统一处理 pivot_wider(names_from = col_type, values_from = str_val) %>% # 转回原始宽表结构 group_by(name) %>% summarise(total_goal = sum(goal))
问题2:部分因子重编码的优雅实现
不需要拆分数据集再合并,只需要在mutate()中加入条件判断,仅对符合要求的行做因子重编码即可,不会影响其他行的因子水平:
library(dplyr) library(forcats) # 生成测试数据 name1 <- c('D', 'E', 'F', 'G', 'D', 'E', 'F' ) room <- rep(c('A','B'),c(4,3)) goal <- c(rnorm(7,mean=60,sd=10)) test1 <- data.frame(name1,goal,room) # 仅对room为B的行重编码因子,不影响room为A的记录 test1 <- test1 %>% mutate(name1 = if_else( condition = room == 'B', true = fct_recode(name1, 'DD'='D','EE'='E','FF'='F'), false = name1 ))
如果有多个判断条件,可以用case_when()替代if_else()。原示例代码的疏漏是对test1B做重编码后没有回赋值给test1B,最终合并的还是未修改的原始数据,上述写法可以直接避免这类中间变量赋值的错误。
内容的提问来源于stack exchange,提问作者Tenstu
相关产品推荐
相关产品推荐

