如何使用现有变量重命名多维数据框(> 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_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"))
我想在 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
感谢@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_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"))
我想在 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