Mostrando entradas con la etiqueta names. Mostrar todas las entradas
Mostrando entradas con la etiqueta names. Mostrar todas las entradas

2020-10-20

Cómo usar la primera fila como nombre de las columnas en R

Title

Problema

Queremos usar la primera fila como nombre de las columnas en R. En nuestro ejemplo, queremos reemplzar los nombres originales de la columna (V1, V2, etc) por los de la primera fila (col1, col2, etc).

    V1   V2   V3   V4   V5
1 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
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 )

Solución

  • Opción 1
  • colnames(df) <- df[1,]
    df <- df[-1, ] 
    

  • Opción 2
  • names(df) <- lapply(df[1, ], as.character)
    df <- df[-1,] 
    

    Resultado

      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
    
    Si queremos reiniciar los nombres de fila:

    rownames(df) <- NULL
    
      col1 col2 col3 col4 col5
    1 row1    2    4    5   56
    2 row2   74   74    3  534
    3 row3  865  768    8    7
    4 row4   68   86   65   87
    

    References

    How to use the first row as column names in R

    Title

    Problem

    We want to use the first row as column names in R. In our example, we'd like to replace the original column names (V1, V2, etc.) for the first row (col1, col2, etc.).

        V1   V2   V3   V4   V5
    1 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
    
    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 )
    

    Solution

  • Option 1
  • colnames(df) <- df[1,]
    df <- df[-1, ] 
    

  • Option 2
  • names(df) <- lapply(df[1, ], as.character)
    df <- df[-1,] 
    

    Results

      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
    
    If we want to reset row names:

    rownames(df) <- NULL
    
      col1 col2 col3 col4 col5
    1 row1    2    4    5   56
    2 row2   74   74    3  534
    3 row3  865  768    8    7
    4 row4   68   86   65   87
    

    References

    2017-10-16

    Eliminar columnas con nombres duplicados de un data frame en R

    Problema

    Queremos eliminar las columnas con nombres duplicados de un data frame en R.

    df <- data.frame(a = 1:2, b = 1:2, 
                     c = 1:2, a = 2:3, 
                     a = 2:3, b = 2:3, 
                     check.names = F)
    
      a b c a a b
    1 1 1 1 2 2 2
    2 2 2 2 3 3 3
    

    Solución

    • Base
    • df[, !duplicated(df)] # o bien
      df[, unique(df)]
      
       a b c
      1 1 1 1
      2 2 2 2
      
    • dplyr
    • Empleamos funciones del paquete base pero evitamos los corchetes para hacerla más legible.

      library(dplyr)
      df %>% subset(select = !duplicated(names(.))) # o bien
      df %>% subset(select = unique(names(.)))
      

    2015-11-05

    Descartar variables de un data frame por su nombre

    Title

    Problema

    Deseamos excluir variables de un data frame de acuerdo a su nombre. En nuestro ejemplo usamos el data frame iris, y queremos descartar las variables Sepal.Length y Petal.Width.

    head(iris)
    
      Sepal.Length Sepal.Width Petal.Length Petal.Width Species
    1          5.1         3.5          1.4         0.2  setosa
    2          4.9         3.0          1.4         0.2  setosa
    3          4.7         3.2          1.3         0.2  setosa
    4          4.6         3.1          1.5         0.2  setosa
    5          5.0         3.6          1.4         0.2  setosa
    6          5.4         3.9          1.7         0.4  setosa
    

    Soluciones

    Hay múltiples opciones.

  • Paquete base
  • # Opción 1
    iris[, -which(names(iris) %in% c("Sepal.Length", "Petal.Width"))]
    # Opción 2
    iris[ , !names(iris) %in% c("Sepal.Length","Petal.Width")]
    # Opción 3
    subset(iris, select = -c(Sepal.Length, Petal.Width)) 
    
  • dplyr
  • library(dplyr)
    iris %>% select(-c(Sepal.Length, Petal.Width))
    
  • data.table
  • library(data.table)
    DT = as.data.table(iris)
    DT[ , !names(DT) %in% c("Sepal.Length", "Petal.Width"), with = FALSE]
    # Otra opción
    subset(DT, select=-c(Sepal.Length, Petal.Width)) 
    

    Resultado

    Las tres variables restantes. Solamente mostramos las 6 primeras filas

      Sepal.Width Petal.Length Species
    1         3.5          1.4  setosa
    2         3.0          1.4  setosa
    3         3.2          1.3  setosa
    4         3.1          1.5  setosa
    5         3.6          1.4  setosa
    6         3.9          1.7  setosa
    

    Notas

    Hay diferencias sutiles entre la primera opción con el paquete base -which y la segunda con la función !. Si con -which especificamos nombres que no encuentra en el data frame devolverá un data frame vacío con cero columnas. Mientras que si sucede lo mismo con !, devolverá el data frame original sin modificar.

    La sintaxis con dplyr es bastante sencilla. Con data.table es muy similar a las utilizadas con el paquete base. No obstante, es necesario especificar el argumento with = FALSE o devolverá un vector lógico. También podemos emplear con data.table la función subset.

    Entradas relacionadas

    Referencias

    Nube de datos