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
また、cbind
呼び出しで列に直接名前を付けることもできます。
cbind(date=c(0,1), high=c(2,3))
出力:
date high
[1,] 0 2
[2,] 1 3
試してください:
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")
あなたの質問で次の例を挙げました:
colnames(merger)[,1]<-"Date"
問題はコンマです:colnames()は行列ではなくベクトルを返すので、解決策は次のとおりです。
colnames(merger)[1]<-"Date"
ベクトルのみをcbind()
に渡すと、データフレームではなく行列が作成されます。読む?data.frame
。
cbind
がすべてベクトルである引数のセットを提供する場合、データフレームではなく、マトリックス、この場合はすべて文字のマトリックスを取得します。それらには異なる機能があります。引数の一部がデータフレームのままであれば、データフレームを取得できます。試してください:
merger <- cbind(Date =as.character(Date),
weather1[ , c("High", "Low", "Avg..High", "Avg.Low")] ,
ScnMov =sale$Scanned.Movement[a] )
data.frame
を生成し、これを1行で行う方法は、cbind
を使用して列名属性を設定しながら、setNames
に渡されるすべての行列/データフレームをdata.frameに強制することです。
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
パッケージにはこのための関数が含まれています。
ベクトルを追加する前に引用符で使用したい名前を追加するだけです
a_matrix <- cbind(b_matrix,'Name-Change'= c_vector)