web-dev-qa-db-fra.com

renommer le nom des colonnes après avoir lié les données

enter image description here

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
30
janicebaratheon

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
58
daknowles

Essayer:

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

Exemple

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")
12
johannes

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"
6
Marcel Hebing

Si vous passez uniquement des vecteurs à cbind() cela crée une matrice, pas une trame de données. Lis ?data.frame.

3
Roland

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] )
2
42-

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 setColNames analogue à setNames 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 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.

2
Alex

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)
0
Priyansh