Как переименовать переменные в многомерном фрейме данных (> 3000 столбцов), используя существующие переменные?

#r #data-wrangling

#r #перебор данных

Вопрос:

Спасибо @Jon Spring за полезное предложение. Следуя предложению Джона, я отредактировал свой пост. Я добавил краткий пример моих фреймов данных и dput() их.

#Вопрос:

Я новичок в программировании на языке R и пытаюсь сделать многомерный фрейм данных доступным для анализа. Мой фрейм данных wc_raw_data содержит 83 строки и 3062 столбца, которые включают 1530 химических веществ, как показано ниже.

 > 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        
 

Поскольку, похоже, объединены два разных фрейма данных, например, [1: 3,] содержат «Анализируемый материал», «Номер CAS» и молекулярный вес» в строках, а [4: 82,] содержат «Название образца», «Номер образца», концентрацию (пмоль / ВБ)» и «Квалификаторы»в столбцах. Я разделил фрейм данных на два wc_chemicals , wc_raw_df и они выглядят так:

 > 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() выбранных фреймов данных:

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

Я хотел использовать существующие названия химических веществ в именах столбцов, показанных как Analyte in wc_chemicals[1,3:3062] , для переименования столбцов с именами «Концентрация» и «Квалификатор» wc_raw_df .
Например, я хотел использовать «1,2,4-трихлорбензол» wc_chemicals[1,3] для переименования «Концентрация (пмоль / ВБ)» wc_raw_df[1, 3] и «Квантификатор» wc_raw_df[1, 4] .
Моя цель — сделать фрейм данных со столбцами похожим на «Концентрация 1,2,4-трихлорбензола» 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[1, 6], . . . » Концентрация фосфамидона II» wc_raw_df[1, 3061] и «Определитель фосфамидона II» wc_raw_df[1,3062] .

Я обнаружил, что в некоторых примерах используются векторы после назначения старых имен и новых имен для переименования, но я думаю, что есть лучший способ, чем переименовывать имена столбцов 3060 по отдельности. Интересно, может ли кто-нибудь научить меня лучшему способу. Заранее благодарим вас за уделенное время.

Комментарии:

1. Вам будет легче помочь, если вы сможете предоставить образец ваших данных или данных в том же формате, например, включив выходные dput(wc_chemicals[1:6,1:6] данные и dput(wc_raw_df[1:6,1:6] в текст вашего вопроса. Это предотвращает двусмысленность и уменьшает необходимость для других переформатировать и переформатировать, чтобы они могли опробовать потенциальные решения для вас.

2. @Jon Spring Спасибо за ваше предложение!

Ответ №1:

Я думаю, что что-то вроде этого должно сработать:

 # 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
 

Результат для примера данных:

 > 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