如何巧妙将变量组合成长字符串?tidyverse代码报错求助
解决多变量组合成长字符串的问题
你原来的across写法之所以报错,是因为across的作用是对多列分别执行操作后返回多个列,但你想把多列合并成单个字符串列,直接赋值给long_string会导致类型不匹配,自然运行失败。
下面给你几种更简洁的实现方式:
方法1:用tidyr::unite(最推荐)
unite是tidyr专门用来合并列的函数,语法直接易懂:
library(tidyverse) data('diamonds') # 合并前7列成long_string,分隔符为_,保留原列(remove=FALSE可省略,省略则删除原列) diamonds %>% unite(long_string, 1:7, sep = '_', remove = FALSE)
方法2:rowwise + cur_data()
通过按行分组,提取当前行的指定列再合并:
diamonds %>% rowwise() %>% mutate(long_string = paste(cur_data()[1:7], collapse = '_')) %>% ungroup()
这里注意用collapse='_'而不是sep='_'——sep是多个独立参数之间的分隔符,collapse是把向量元素合并成单个字符串的分隔符。
方法3:pmap_chr批量处理每行
用pmap系列函数对每行的指定列执行合并操作:
diamonds %>% mutate(long_string = pmap_chr(select(., 1:7), ~ paste(c(...), collapse = '_')))
select(.,1:7)筛选出要合并的列,pmap_chr会把每行的列值作为参数传入,c(...)将这些参数转为向量后用paste合并。
内容的提问来源于stack exchange,提问作者anderwyang
相关产品推荐
相关产品推荐

