在dplyr的mutate中使用paste()为何无法按行计算?
问题原因
vec1:vec2并非按行生成对应序列,R会将整个vec1和vec2向量作为范围参数处理(实际是基于向量元素生成一个全局序列),随后paste(..., collapse=",")会把这个全局序列合并成单一字符串。在mutate中,单个值会被自动广播到所有行,因此每行的new_col结果完全相同。
解决方案
以下几种方法都能实现逐行生成序列并合并的需求:
方法1:用rowwise()实现逐行处理
library(dplyr) vec1 <- c(2, 5) vec2 <- c(4, 6) test_df <- data.frame(vec1, vec2) test_df %>% rowwise() %>% mutate(new_col = paste(vec1:vec2, collapse = ",")) %>% ungroup() # 处理完记得取消逐行模式,避免后续操作效率下降
方法2:用purrr::map2_chr高效处理(适合大数据场景)
library(dplyr) library(purrr) test_df %>% mutate(new_col = map2_chr(vec1, vec2, ~paste(.x:.y, collapse = ",")))
方法3:用base R的apply实现(无需额外安装包)
test_df$new_col <- apply(test_df, 1, function(x) paste(x[1]:x[2], collapse = ","))
以上方法均能得到预期输出:
vec1 vec2 new_col 1 2 4 2,3,4 2 5 6 5,6
内容的提问来源于stack exchange,提问作者Sebastian Geis
相关产品推荐
相关产品推荐

