merger <- cbind(as.character(Date),weather1$High,weather1$Low,weather1$Avg..High,weather1$Avg.Low,sale$Scanned.Movement[a])
Après cbind
les données, le nouveau DF a automatiquement les noms des colonnes V1
, V2
...... Je veux renommer la colonne par
colnames(merger)[,1] <- "Date"
mais a échoué. Et quand j'utilise merger$V1
,
Error in merger$V1 : $ operator is invalid for atomic vectors
Vous pouvez également nommer des colonnes directement dans l'appel cbind
, par exemple.
cbind(date=c(0,1), high=c(2,3))
Sortie:
date high
[1,] 0 2
[2,] 1 3
Essayer:
colnames(merger)[1] <- "Date"
Voici un exemple simple:
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")
vous avez donné l'exemple suivant dans votre question:
colnames(merger)[,1]<-"Date"
le problème est la virgule: colnames () renvoie un vecteur, pas une matrice, donc la solution est:
colnames(merger)[1]<-"Date"
Si vous passez uniquement des vecteurs à cbind()
cela crée une matrice, pas une trame de données. Lis ?data.frame
.
Si vous offrez à cbind
un ensemble d'arguments qui sont tous des vecteurs, vous obtiendrez non pas une trame de données, mais plutôt une matrice, dans ce cas une matrice de caractères. Ils ont des caractéristiques différentes. Vous pouvez obtenir une trame de données si certains de vos arguments restent des trames de données, essayez:
merger <- cbind(Date =as.character(Date),
weather1[ , c("High", "Low", "Avg..High", "Avg.Low")] ,
ScnMov =sale$Scanned.Movement[a] )
Une façon de produire un data.frame
et pouvoir le faire sur une seule ligne revient à contraindre toutes les matrices/trames de données passées à cbind
dans un data.frame tout en définissant l'attribut names de colonne à l'aide de 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')))
qui produit:
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
Malheureusement, il n'y a pas de fonction pour les trames de données qui renvoient la matrice après les noms de colonne, cependant, rien ne vous empêche d'adapter le code de setColNames
analogue à setNames
setNames
pour en produire un:
setColNames <- function (object = nm, nm) {
colnames(object) <- nm
object
}
Voir cette réponse , le package magrittr
contient des fonctions pour cela.
Il est facile d'ajouter simplement le nom que vous souhaitez utiliser entre guillemets avant d'ajouter le vecteur
a_matrix <- cbind(b_matrix,'Name-Change'= c_vector)