如何在tidyverse的mutate中用字符串向量结合paste生成ID
解决方案
你遇到的问题是直接用paste(mygroup, collapse = "_")只会拼接列名字符串,而不是对应行的列值。下面是几种可行的解决办法:
方法1:使用unite(最简洁的tidyverse方式)
unite函数专门用来合并列,配合all_of()可以直接引用字符串向量中的列名:
df %>% unite(ID, all_of(mygroup), sep = "_", remove = FALSE)
remove = FALSE保留原列,默认是TRUE会删掉用来合并的列,可根据需求调整。
方法2:使用rowwise + c_across
先按行分组,再提取指定列的行值进行拼接:
df %>% rowwise() %>% mutate(ID = paste(c_across(all_of(mygroup)), collapse = "_")) %>% ungroup()
rowwise()让后续操作按行执行,c_across()提取每行中mygroup指定列的值组成向量,再用paste完成拼接。
方法3:使用rlang符号转换(适合理解tidyeval逻辑)
把字符串向量转成列名符号,再用!!!展开到paste中:
df %>% mutate(ID = paste(!!!syms(mygroup), sep = "_"))
syms(mygroup)把字符串转成列名符号,!!!将符号向量展开成单独参数传给paste,从而取到每行的列值。
验证结果
以上三种方法都能得到你期望的输出:
# A tibble: 2 x 4 PERIOD CODE VALUE ID <dbl> <chr> <dbl> <chr> 1 1995 A 10 1995_A 2 1996 B 20 1996_B
内容的提问来源于stack exchange,提问作者arnyeinstein
相关产品推荐
相关产品推荐

