如何使用现有变量重命名多维数据框(> 3000 列)中的变量?

How to rename variables in multidimensional data frame (>3000 columns) using existing variables?

感谢@Jon Spring 的有用建议。按照 Jon 的建议,我编辑了我的 post。我添加了我的数据框的简短示例和其中的 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,] 包含“样品名称”,“样本编号”、浓度 (pMol/WB)” 和列中的 “限定符”。我将数据框分成两个 wc_chemicalswc_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"))

我想在 wc_chemicals[1,3:3062] 中显示为 Analyte 的列名中使用 现有化学品名称 来重命名名为“Concentraion”和 wc_raw_df 中的“Qualifier”。 例如,我想用“1,2,4-三氯苯wc_chemicals[1,3]重命名“浓度(pMol/WB)”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 列名称更好的方法。我想知道是否有人可以教我更好的方法。感谢您提前抽出时间。

我认为这样的事情应该可行:

# 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