Cela devrait être un problème si facile, mais j'ai du mal avec. J'ai un ensemble de données sale que je ne pouvais pas lire avec header=T
. Après l'avoir lu et nettoyé, je voudrais utiliser les données de la première ligne maintenant comme nom de colonne. J'ai essayé plusieurs méthodes sur stackoverflow sans succès. Quel pourrait être le problème? L'ensemble de données t1
Devrait ressembler à ceci après le nettoyage:
V1 V2 V3 V4 V5
1 col1 col2 col3 col4
2 row1 2 4 5 56
3 row2 74 74 3 534
4 row3 865 768 8 7
5 row4 68 86 65 87
J'ai essayé: colnames(t1)=t1[1,]
. Rien ne se passe.
J'ai essayé: names(t1)=ti[1,]
, rien ne se passe.
J'ai essayé: lapply(t1, function(x) {names(x)<-x[1,]; x})
il renvoie un message d'erreur:
Erreur dans
[.default
(X, 1,): nombre de dimensions incorrect
Quelqu'un pourrait-il aider?
header.true <- function(df) {
names(df) <- as.character(unlist(df[1,]))
df[-1,]
}
test
df1 <- data.frame(c("a", 1,2,3), c("b", 4,5,6))
header.true(df1)
a b
2 1 4
3 2 5
4 3 6
Prenez du recul lorsque vous lisez vos données, utilisez skip=1
dans read.table
pour rater entièrement la première ligne. Cela devrait rendre la vie un peu plus facile lorsque vous nettoyez des données, en particulier pour le type de données. Ceci est essentiel car votre problème provient de l'encodage de vos données en tant que facteur.
Vous pouvez ensuite lire séparément les noms de vos colonnes avec nrows=1
dans read.table
.
Probablement, le type de données des colonnes de trame de données sont des facteurs. C'est pourquoi le code que vous avez essayé n'a pas fonctionné, vous pouvez le vérifier en utilisant str(df)
:
Utilisez l'argument
stringsAsFactors = FALSE
lorsque vous importez vos données:
df <- read.table(text = "V1 V2 V3 V4 V5
col1 col2 col3 col4 col5
row1 2 4 5 56
row2 74 74 3 534
row3 865 768 8 7
row4 68 86 65 87", header = TRUE,
stringsAsFactors = FALSE )
Ensuite, vous pouvez utiliser votre première tentative, puis supprimer votre première ligne si vous le souhaitez:
colnames(df) <- df[1,]
df <- df[-1, ]
Cela fonctionnera si vos colonnes sont des facteurs ou des caractères:
names(df) <- lapply(df[1, ], as.character)
df <- df[-1,]
Production:
col1 col2 col3 col4 col5
2 row1 2 4 5 56
3 row2 74 74 3 534
4 row3 865 768 8 7
5 row4 68 86 65 87
Que diriez-vous:
my.names <- t1[1,]
colnames(t1) <- my.names
c'est-à-dire nommer spécifiquement la ligne en tant que variable?
avec le code suivant:
namex <-c("col1","col2","col3","col4")
row1 <- c(2, 4, 5, 56)
row2 <- c(74, 73, 3, 534)
row3 <- c(865, 768, 8, 7)
row4 <- c(68, 58, 65, 87)
t1 <- data.frame(namex, row1, row2, row3, row4)
t1 <- t(t1)
my.names <- t1[1,]
colnames(t1) <- my.names
Cela semble fonctionner, mais peut-être que je manque quelque chose?
Utilisation de data.table:
library(data.table)
namex <-c("col1","col2","col3","col4")
row1 <- c(2, 4, 5, 56)
row2 <- c(74, 73, 3, 534)
row3 <- c(865, 768, 8, 7)
row4 <- c(68, 58, 65, 87)
t1 <- data.table(namex, row1, row2, row3, row4)
t1 <- data.table(t(t1))
setnames(t1, as.character(t1[1,]))
t1 <- t1[-1,]
Semblable à certaines des autres réponses, voici une option dplyr
/tidyverse
:
library(tidyverse)
names(df) <- df %>% slice(1) %>% unlist()
df <- df %>% slice(-1)