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
4

7 回答 7

81

You can also name columns directly in the cbind call, e.g.

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

Output:

     date high
[1,]    0    2
[2,]    1    3
于 2014-04-01T22:37:48.627 回答
15

尝试:

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")
于 2012-06-19T18:23:31.427 回答
6

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

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

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

colnames(merger)[1]<-"Date"
于 2012-08-11T21:36:12.780 回答
4

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

于 2012-06-19T18:29:44.263 回答
4

一种产生data.frame并能够在一行中执行此操作的方法是强制所有传递给cbinddata.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

不幸的是,没有setColNames类似的功能setNames但是,对于在列名之后返回矩阵的数据框,没有什么可以阻止您调整代码setNames以生成:

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

请参阅此答案,该magrittr包包含此功能。

于 2017-03-01T03:51:40.910 回答
3

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

merger <- cbind(Date =as.character(Date),
             weather1[ , c("High", "Low", "Avg..High", "Avg.Low")] , 
             ScnMov =sale$Scanned.Movement[a] )
于 2012-06-19T18:34:30.587 回答
2

在添加矢量之前,只需在引号中添加要使用的名称即可

a_matrix <- cbind(b_matrix,'Name-Change'= c_vector)
于 2017-06-18T19:18:00.620 回答