#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