Gracias @Jon Spring por su útil sugerencia. Siguiendo la sugerencia de Jon, edité mi publicación. Agregué un breve ejemplo de mis marcos de datos y dput() de ellos.

#Pregunta:

Soy un novato en la programación de R y trato de hacer que un marco de datos multidimensional sea analizable. Mi marco de datos wc_raw_data tiene 83 filas y 3062 columnas que incluyen 1530 sustancias químicas como se muestra a continuación.

> wc_raw_data <- read_xlsx(wc_raw_file, sheet=2, skip=1, col_names = F)

> wc_raw_data
# A tibble: 82 x 3,062
.
.
> wc_raw_data[1:6,1:6]
# A tibble: 6 x 6
  ...1        ...2                     ...3                    ...4      ...5                        ...6     
  <chr>       <chr>                    <chr>                   <chr>     <chr>                       <chr>    
1 NA          Analyte                  1,2,4-Trichlorobenzene  NA        1,2-Dibromo-3-chloropropane NA       
2 NA          CAS Number               120-82-1                NA        96-12-8                     NA       
3 NA          Molecular Weight (g/mol) 181.447                 NA        236.333                     NA       
4 Sample Name Sample Number            Concentration (pMol/WB) Qualifier Concentration (pMol/WB)     Qualifier
5 CAS 001     A191916                  <276                    U         <423                        U        
6 CAS 002     A191917                  <276                    U         <423                        U        

Como parece que se combinan dos marcos de datos diferentes, por ejemplo, [1: 3,] contiene "Analito", "Número CAS" y Peso molecular "en filas y [4:82,] contiene" Nombre de muestra "," Número de muestra ", Concentración (pMol / WB) "y" Calificadores "en columnas. Divido el marco de datos en dos wc_chemicals y wc_raw_df y se ven así:

> wc_chemicals[1:3,1:6]
# A tibble: 3 x 6
  ...1  ...2                     ...3                   ...4  ...5                        ...6 
  <lgl> <chr>                    <chr>                  <lgl> <chr>                       <lgl>
1 NA    Analyte                  1,2,4-Trichlorobenzene NA    1,2-Dibromo-3-chloropropane NA   
2 NA    CAS Number               120-82-1               NA    96-12-8                     NA   
3 NA    Molecular Weight (g/mol) 181.447                NA    236.333                     NA   

> wc_raw_df[1:6, 1:6]
# A tibble: 6 x 6
  ...1        ...2          ...3                    ...4      ...5                    ...6     
  <chr>       <chr>         <chr>                   <chr>     <chr>                   <chr>    
1 Sample Name Sample Number Concentration (pMol/WB) Qualifier Concentration (pMol/WB) Qualifier
2 CAS 001     A191916       <276                    U         <423                    U        
3 CAS 002     A191917       <276                    U         <423                    U        
4 CAS 003     A191918       <276                    U         <423                    U        
5 CAS 004     A191919       <276                    U         <423                    U        
6 CAS 005     A191920       <276                    U         <423                    U        

dput() de los marcos de datos seleccionados:

> dput(wc_chemicals[1:3,1:6])
structure(list(...1 = c(NA, NA, NA), ...2 = c("Analyte", "CAS Number", 
"Molecular Weight (g/mol)"), ...3 = c("1,2,4-Trichlorobenzene", 
"120-82-1", "181.447"), ...4 = c(NA, NA, NA), ...5 = c("1,2-Dibromo-3-chloropropane", 
"96-12-8", "236.333"), ...6 = c(NA, NA, NA)), row.names = c(NA, 
-3L), class = c("tbl_df", "tbl", "data.frame"))
> dput(wc_raw_df[1:6,1:6])
structure(list(...1 = c("Sample Name", "CAS 001", "CAS 002", 
"CAS 003", "CAS 004", "CAS 005"), ...2 = c("Sample Number", "A191916", 
"A191917", "A191918", "A191919", "A191920"), ...3 = c("Concentration (pMol/WB)", 
"<276", "<276", "<276", "<276", "<276"), ...4 = c("Qualifier", 
"U", "U", "U", "U", "U"), ...5 = c("Concentration (pMol/WB)", 
"<423", "<423", "<423", "<423", "<423"), ...6 = c("Qualifier", 
"U", "U", "U", "U", "U")), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))

Quería usar los nombres de productos químicos existentes en los nombres de las columnas que se muestran como Analyte en wc_chemicals[1,3:3062] para cambiar el nombre de las columnas como " Concentración " y "< fuerte> Calificador "en wc_raw_df. Por ejemplo, quería usar " 1,2,4-Triclorobenceno " wc_chemicals[1,3] para cambiar el nombre de "Concentración (pMol / WB)" wc_raw_df[1, 3] y "Cuantificador" {{X5 }}. Mi objetivo es hacer que el marco de datos con columnas se vea como "Concentración de 1,2,4-Triclorobenceno" wc_raw_df[1, 3, "1,2,4-Trichlorobenzene Qualifier" wc_raw_df [1, 4] , "1,2-Dibromo-3-chloropropane Concentration" wc_raw_df [1, 5] , "1,2-Dibromo-3-chloropropane Qualifier" wc_raw_df [ dieciséis], . . . "Concentración de fosfamidón II" wc_raw_df[1, 3061] y "Calificador de fosfamidón II" wc_raw_df[1,3062].

Encontré algunos ejemplos que usan vectores después de asignar nombres antiguos y nuevos nombres para cambiar el nombre, pero creo que hay una mejor manera que cambiar el nombre de 3060 columnas individualmente. Me pregunto si alguien puede enseñarme mejor. Gracias por su tiempo por adelantado.

0
JYL 24 feb. 2021 a las 19:55

1 respuesta

La mejor respuesta

Creo que algo como esto debería funcionar:

# extract row 1 values from col 3 to the end                                                                                              
wc_chem_names <- as.character(wc_chemicals[1, 3:(ncol(wc_chemicals))])


library(dplyr)
# extracted values from above + alternating Conc / Qual
col_names <- tibble(chem = wc_chem_names, 
                    cat = rep(c("Concentration", "Qualifier"), 
                              length.out = length(wc_chem_names))) %>%
  mutate(chem = if_else(chem == "NA", lag(chem), chem),
         chem_combo = paste(chem, cat)) %>%
  pull(chem_combo)

# Assign those values to the column headers
names(wc_raw_df)[3:ncol(wc_raw_df)] <- col_names

Resultado en datos de ejemplo:

> wc_raw_df
# A tibble: 6 x 6
  ...1        ...2          `1,2,4-Trichlorobenzene Concentration` `1,2,4-Trichlorobenzene Qualifier` `1,2-Dibromo-3-chloropropane Concentration` `1,2-Dibromo-3-chloropropane Qualifier`
  <chr>       <chr>         <chr>                                  <chr>                              <chr>                                       <chr>                                  
1 Sample Name Sample Number Concentration (pMol/WB)                Qualifier                          Concentration (pMol/WB)                     Qualifier                              
2 CAS 001     A191916       <276                                   U                                  <423                                        U                                      
3 CAS 002     A191917       <276                                   U                                  <423                                        U                                      
4 CAS 003     A191918       <276                                   U                                  <423                                        U                                      
5 CAS 004     A191919       <276                                   U                                  <423                                        U                                      
6 CAS 005     A191920       <276                                   U                                  <423                                        U         
1
Jon Spring 28 feb. 2021 a las 01:52