R语言如何使用cbind函数一次性为多个新增列指定列名
R语言cbind拼接多列时批量指定列名方案
报错原因
R的函数参数命名规则仅支持单个文本作为参数名,cbind()中列名 = 待拼接数据的写法本质是给传入的参数命名,无法直接传入长度大于1的字符向量一次性为多个新列命名,因此c('new2', 'new3') = 待拼接数据的写法不符合语法规则,会直接报错。
可直接复用的实现方案
- 方案1:提前给待拼接的多列数据设置列名,再传入cbind
这是兼容性最好的基础R实现,不需要依赖任何扩展包:
# 生成要新增的多列数据 new_data <- apply(X = array(data = 1:64, dim = c(32, 2)), MARGIN = c(1,2), FUN = function(x) {return(x)}) # 批量设置列名 colnames(new_data) <- c("new2", "new3") # 完成拼接 res <- cbind(mtcars, new_data)
- 方案2:用
setNames()在cbind内部完成命名,无需中间变量
适合不想额外定义中间变量的场景:
res <- cbind( mtcars, setNames( apply(X = array(data = 1:64, dim = c(32, 2)), MARGIN = c(1,2), FUN = function(x) {return(x)}), c("new2", "new3") ) )
- 方案3:拼接完成后批量修改新增列的列名
适合已经完成拼接、后续补设列名的场景:
# 先完成无列名的拼接 res <- cbind(mtcars, apply(X = array(data = 1:64, dim = c(32, 2)), MARGIN = c(1,2), FUN = function(x) {return(x)})) # 定位到新增列的位置,批量赋值列名 colnames(res)[(ncol(mtcars)+1):ncol(res)] <- c("new2", "new3")
提示:
cbind()处理矩阵类型的输入时,会自动把矩阵的每一列拆分为数据框的独立新列,只要提前给矩阵设置好colnames,拼接后会自动保留预设的列名,不会出现列名丢失或自动生成V1、V2这类默认列名的问题。
内容的提问来源于stack exchange,提问作者user1
相关产品推荐
相关产品推荐

