如何在magrittr管道中混合向量级与表级操作并实现无影响子集化?
太懂这种憋屈感了!magrittr管道本来是让代码像流水线一样流畅,结果遇到向量级操作(比如str_sub())和表级操作(比如mutate())混合的时候,要么拆成好几段赋值,要么嵌套一堆函数,完全破坏了那种丝滑的体验。
先看看你提到的两种不太理想的处理方式:
1. 拆分管道+分段赋值
这种方式把连贯的操作拆成了两步,还得反复引用数据集,完全没了管道的优雅感:
iris$Species %<>% str_sub(.,1,-3) iris %<>% mutate(., compliments=str_c("pretty"," ",Species))
2. 多层嵌套函数
虽然是单管道,但一旦操作变复杂,嵌套层数上来,代码可读性直接拉胯,后期维护起来头大:
iris%>%mutate(., compliments=str_c( "pretty", " ", str_sub(Species,1,-3) ) )
你期望的那种“向量操作→表操作”的连贯写法确实很诱人,比如这种(虽然现在跑不起来):
iris %>% str_sub(.$Species,1,-3) %>% mutate(., compliments=str_c("pretty"," ",Species))
给你两个更优雅的解决方案:
方案一:多步mutate连贯操作
其实mutate本身就是用来处理表中列(也就是向量)的工具,我们可以用它先完成向量级的修改,然后无缝衔接后续表操作,完全不用拆分管道:
iris %>% mutate(Species = str_sub(Species, 1, -3)) %>% mutate(compliments = str_c("pretty", " ", Species))
方案二:单mutate多操作合并
如果觉得多次mutate有点冗余,还可以把多个操作塞进同一个mutate里,既保持管道的流畅性,又避免嵌套:
iris %>% mutate( Species = str_sub(Species, 1, -3), compliments = str_c("pretty", " ", Species) )
这两种方式都完美契合管道“流式操作”的设计初衷,代码清爽又易读,完全不用再纠结拆分或嵌套的问题~
内容的提问来源于stack exchange,提问作者D3SL
相关产品推荐
相关产品推荐

