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
答案 0 :(得分:57)
您还可以直接在cbind
来电中为列命名,例如:
cbind(date=c(0,1), high=c(2,3))
输出:
date high
[1,] 0 2
[2,] 1 3
答案 1 :(得分:12)
尝试:
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")
答案 2 :(得分:6)
您在问题中提供了以下示例:
colnames(merger)[,1]<-"Date"
问题是逗号:colnames()返回一个向量,而不是一个矩阵,所以解决方案是:
colnames(merger)[1]<-"Date"
答案 3 :(得分:3)
如果仅将向量传递给cbind()
,则会创建矩阵,而不是数据帧。阅读?data.frame
。
答案 4 :(得分:2)
如果你提供cbind
一组参数,它们都是向量,你将得到的不是数据帧,而是矩阵,在这种情况下是一个全字符矩阵。它们有不同的功能。如果您的某些参数仍为数据帧,则可以获取数据帧,请尝试:
merger <- cbind(Date =as.character(Date),
weather1[ , c("High", "Low", "Avg..High", "Avg.Low")] ,
ScnMov =sale$Scanned.Movement[a] )
答案 5 :(得分:2)
生成data.frame
并能够在一行中执行此操作的方法是将传递给cbind
的所有矩阵/数据帧强制转换为data.frame,同时使用{设置列名属性{1}}:
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
请参阅this answer,setColNames <- function (object = nm, nm) {
colnames(object) <- nm
object
}
包中包含此功能。
答案 6 :(得分:0)
在添加之前,只需添加要在引号中使用的名称即可 矢量
a_matrix <- cbind(b_matrix,'Name-Change'= c_vector)