如何无需逐个指定列名将多列数据合并为逗号分隔的单列?
解决方案
当然可以不用手动列所有列名,下面给你几种简洁的实现方式,适配你的R代码场景:
方法1:用tidyr的unite函数(最简洁)
unite是专门用来合并多列的函数,直接指定所有列合并,一步到位:
library(dplyr) library(tidyr) input <- mtcars # 优化列名赋值,不用手动写V1到V11 colnames(input) <- paste0("V", 1:11) # 合并所有列为逗号分隔的单列 output <- input %>% unite(col = "join", everything(), sep = ",")
everything()代表选中数据框的所有列,不用逐个列名指定col = "join"指定合并后的列名,sep = ","设置分隔符
方法2:用dplyr的rowwise+c_across
如果需要更灵活的行级处理,可以用这个组合:
library(dplyr) input <- mtcars colnames(input) <- paste0("V", 1:11) output <- input %>% rowwise() %>% # 取每行所有列,用逗号合并 mutate(join = paste(c_across(everything()), collapse = ",")) %>% ungroup() %>% select(join)
rowwise()让后续操作按行执行c_across(everything())提取当前行的所有列值组成向量paste(..., collapse = ",")把向量元素用逗号连接成字符串
方法3:Base R实现(无需额外包)
如果不想加载tidyverse包,用基础R的apply函数也能搞定:
input <- mtcars colnames(input) <- paste0("V", 1:11) # 按行遍历,合并每行的所有值为逗号分隔字符串 output <- data.frame(join = apply(input, 1, function(row) paste(row, collapse = ",")))
apply(input, 1, ...)表示按行(第二个参数1代表行)处理数据框- 匿名函数把每行的元素合并成一个字符串
另外注意你原代码里的mutate(output11, ...)应该是笔误,应该用你定义的input数据框哦。
内容的提问来源于stack exchange,提问作者alice_hooper
相关产品推荐
相关产品推荐

