R语言无需逐个输入变量名拼接31个字符型变量的解决方法
报错原因
你的代码报错是因为直接传入了变量名字符串向量names2,str_c(unlist(names2))实际拼接的是30个变量名文本,返回长度为30的向量,和数据框7521行的长度不匹配,并非你需要的按行拼接对应列的实际取值。
解决方案
方法1:使用tidyr的unite()(最简便)
unite是tidyverse专门用来拼接多列生成新列的函数,直接按列位置选择即可,不需要提前提取变量名:
library(dplyr) library(tidyr) TVs2 <- TVs %>% # 参数依次为:新列名、要拼接的列范围、拼接分隔符、是否删除原列 unite(productid, 2:31, sep = "", remove = FALSE)
如果不需要保留原来的2-31列,把remove参数改为TRUE即可。
方法2:在mutate中配合reduce拼接
如果你偏好保持mutate的写法,可以用purrr的reduce迭代拼接选中列:
library(dplyr) library(purrr) library(stringr) TVs2 <- TVs %>% mutate(productid = reduce(across(2:31), str_c, sep = ""))
方法3:沿用你提前提取的names2变量
如果你已经提前提取了names2变量,可以用do.call把选中列传入paste0:
TVs2 <- TVs %>% mutate(productid = do.call(paste0, .[names2]))
这里的.指代管道传入的TVs数据框,.[names2]会提取你选中的30列传入拼接函数。
内容的提问来源于stack exchange,提问作者krsinif
相关产品推荐
相关产品推荐

