在 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自动有列名V1
,V2
......
我想通过
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
不幸的是,对于在列名之后返回矩阵的数据帧,没有类似于 的setNames
setColNames
函数,但是,没有什么可以阻止您调整@ 的代码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 数据后重命名列名的主要内容,如果未能解决你的问题,请参考以下文章