在 cbind 数据后重命名列名

Posted

技术标签:

【中文标题】在 cbind 数据后重命名列名【英文标题】:rename the columns name after cbind the data 【发布时间】:2012-06-21 20:18:44 【问题描述】:

merger <- cbind(as.character(Date),weather1$High,weather1$Low,weather1$Avg..High,weather1$Avg.Low,sale$Scanned.Movement[a])

cbind数据之后,新的DF自动有列名V1V2...... 我想通过

重命名列
colnames(merger)[,1] <- "Date"

但是失败了。而当我使用 merger$V1 时,

Error in merger$V1 : $ operator is invalid for atomic vectors

【问题讨论】:

【参考方案1】:

很简单,只需在添加之前将要使用的名称添加到引号中即可 向量

a_matrix <- cbind(b_matrix,'Name-Change'= c_vector)

【讨论】:

【参考方案2】:

产生data.frame 并能够在一行中执行此操作的一种方法是将传递给cbind 的所有矩阵/数据帧强制转换为data.frame,同时使用setNames 设置列名属性:

a = matrix(rnorm(10), ncol = 2)
b = matrix(runif(10), ncol = 2)

cbind(setNames(data.frame(a), c('n1', 'n2')), 
      setNames(data.frame(b), c('u1', 'u2')))

产生:

          n1        n2         u1        u2
1 -0.2731750 0.5030773 0.01538194 0.3775269
2  0.5177542 0.6550924 0.04871646 0.4683186
3 -1.1419802 1.0896945 0.57212043 0.9317578
4  0.6965895 1.6973815 0.36124709 0.2882133
5  0.9062591 1.0625280 0.28034347 0.7517128

不幸的是,对于在列名之后返回矩阵的数据帧,没有类似于setNamessetColNames 函数,但是,没有什么可以阻止您调整@ 的代码987654329@制作一个:

setColNames <- function (object = nm, nm) 
    colnames(object) <- nm
    object

请参阅this answer,magrittr 包包含此功能。

【讨论】:

【参考方案3】:

您也可以直接在 cbind 调用中命名列,例如

cbind(date=c(0,1), high=c(2,3))

输出:

     date high
[1,]    0    2
[2,]    1    3

【讨论】:

我有同样的想法,但不知何故,在我的情况下只使用了第一个列名,随后的列名被忽略了...... 试试as.data.frame(cbind(date=c(0,1), high=c(2,3)))【参考方案4】:

您在问题中给出了以下示例:

colnames(merger)[,1]<-"Date"

问题是逗号:colnames() 返回一个向量,而不是矩阵,所以解决方法是:

colnames(merger)[1]<-"Date"

【讨论】:

【参考方案5】:

试试:

colnames(merger)[1] <- "Date"

示例

这是一个简单的例子:

a <- 1:10
b <- cbind(a, a, a)
colnames(b)

# change the first one
colnames(b)[1] <- "abc"

# change all colnames
colnames(b) <- c("aa", "bb", "cc")

【讨论】:

@jimsigner 我试过了,说:'dimnames' [2] 的长度不等于数组范围 你能提供一个可重现的小例子吗?【参考方案6】:

如果您提供cbind 一组参数,所有这些参数都是向量,您将得到的不是数据帧,而是一个矩阵,在这种情况下是一个全字符矩阵。他们有不同的特点。如果您的某些参数仍然是数据框,您可以获得数据框,请尝试:

merger <- cbind(Date =as.character(Date),
             weather1[ , c("High", "Low", "Avg..High", "Avg.Low")] , 
             ScnMov =sale$Scanned.Movement[a] )

【讨论】:

【参考方案7】:

如果您只将向量传递给cbind(),它会创建一个矩阵,而不是一个数据框。阅读?data.frame

【讨论】:

以上是关于在 cbind 数据后重命名列名的主要内容,如果未能解决你的问题,请参考以下文章

将数据导出到 csv 并在计算机配置文件名称后重命名

在文件作为 RandomAccessFile 打开并映射为 MappedByteBuffer 后重命名文件

在特定模式后重命名 JSON 键

是否可以在 mongo 的组聚合后重命名 _id 字段?

如何在Java中删除图像后重命名文件并删除原始文件?

重命名数据框列名