web-dev-qa-db-fra.com

utiliser les données de la première ligne comme noms de colonne dans r

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?

12
sstww
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
6
Pierre Lafortune

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.

4
MikeRSpencer

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):

  • Première option
  • Utilisez l'argument stringsAsFactors = FALSElorsque 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, ] 
    
  • Deuxième option
  • 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
    
    3
    mpalanco

    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?

    1
    mattbawn

    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,]
    
    1
    DMillan

    Semblable à certaines des autres réponses, voici une option dplyr/tidyverse:

    library(tidyverse)
    
    names(df) <- df %>% slice(1) %>% unlist()
    df <- df %>% slice(-1)
    
    0
    sbha