Создание сводной таблицы в нижней части кадра данных

Пожалуйста помоги!!

У меня есть следующий кадр данных (с именем Final_APOL1). Мне нужно создать сводную таблицу, как показан второй кадр данных. После создания можно ли сохранить это как отдельный выходной csv, который будет сохранен в том же каталоге?

Сводная таблица проходит через переменные количества аллелей риска и распределяет их по категориям, чтобы можно было рассчитать популяционные частоты для каждой мутации.

Код аллеля риска 1, 2 или нет

 "no APOL1 Risk Alleles" = ifelse(`Final genotype of APOL1` == "G0/G0", 1, NA),

    "1 APOL1 Risk Alleles" = 
      ifelse(`Final genotype of APOL1` %in% c("G0/G2", "G1^{GM}/G0", "G1^{G+}/G0"), 1, NA),

    "2 APOL1 Risk Alleles" =
      ifelse(`Final genotype of APOL1` %in% c("G1^{GM}/G1^{GM}", "G1^{GM}/G2", "G2/G2"), 1, NA))

Генотипы в Final_APOL1 соответствуют следующим категориям для сводной_таблицы.

G1^{GM}/G2 and G1^{G+}/G2 = G1/G2 for Summary_table
G1^{GM}/G1^{GM} = G1/G1 for Summary_table
G1^{GM}/G0 and G1^{G+}/G0 = G1/G0 for Summary_table
G2/G2 = G2/G2 for Summary_table
G0/G2 = G0/G2 for Summary_table

кадр данных (Final_APOL1)

structure(list(Well = structure(1:96, .Label = c("A01", "A02", 
"A03", "A04", "A05", "A06", "A07", "A08", "A09", "A10", "A11", 
"A12", "B01", "B02", "B03", "B04", "B05", "B06", "B07", "B08", 
"B09", "B10", "B11", "B12", "C01", "C02", "C03", "C04", "C05", 
"C06", "C07", "C08", "C09", "C10", "C11", "C12", "D01", "D02", 
"D03", "D04", "D05", "D06", "D07", "D08", "D09", "D10", "D11", 
"D12", "E01", "E02", "E03", "E04", "E05", "E06", "E07", "E08", 
"E09", "E10", "E11", "E12", "F01", "F02", "F03", "F04", "F05", 
"F06", "F07", "F08", "F09", "F10", "F11", "F12", "G01", "G02", 
"G03", "G04", "G05", "G06", "G07", "G08", "G09", "G10", "G11", 
"G12", "H01", "H02", "H03", "H04", "H05", "H06", "H07", "H08", 
"H09", "H10", "H11", "H12"), class = "factor"), G1_1_1 = c("Blank", 
"Blank", "+", "+", "+", "+", "G1^{S342G}", "G1^{S342G}", "+", 
"+", "G1^{S342G}", "G1^{S342G}", "Blank", "Blank", "+", "+", 
"+", "+", "+", "+", "G1^{S342G}", "G1^{S342G}", "+", "+", "Blank", 
"Blank", "+", "+", "G1^{S342G}", "G1^{S342G}", "G1^{S342G}", 
"G1^{S342G}", "G1^{S342G}", "G1^{S342G}", "G1^{S342G}", "G1^{S342G}", 
"Blank", "Blank", "+", "+", "G1^{S342G}", "G1^{S342G}", "G1^{S342G}", 
"G1^{S342G}", "+", "+", "G1^{S342G}", "G1^{S342G}", "G1^{S342G}", 
"G1^{S342G}", "+", "+", "+", "+", "+", "+", "G1^{S342G}", "G1^{S342G}", 
"+", "+", "G1^{S342G}", "G1^{S342G}", "+", "+", "+", "+", "+", 
"+", "+", "+", "+", "+", "+", "+", "G1^{S342G}", "G1^{S342G}", 
"G1^{S342G}", "G1^{S342G}", "+", "+", "+", "+", "+", "+", "G1^{S342G}", 
"G1^{S342G}", "G1^{S342G}", "G1^{S342G}", "+", "+", "+", "+", 
"+", "+", "G1^{S342G}", "G1^{S342G}"), G1_1_2 = c("Blank", "Blank", 
"+", "+", "+", "+", "+", "+", "+", "+", "+", "+", "Blank", "Blank", 
"+", "+", "+", "+", "+", "+", "+", "+", "+", "+", "Blank", "Blank", 
"+", "+", "+", "+", "+", "+", "+", "+", "+", "+", "Blank", "Blank", 
"+", "+", "+", "+", "+", "+", "+", "+", "+", "+", "+", "+", "+", 
"+", "+", "+", "+", "+", "G1^{S342G}", "G1^{S342G}", "+", "+", 
"+", "+", "+", "+", "+", "+", "+", "+", "+", "+", "+", "+", "+", 
"+", "+", "+", "+", "+", "+", "+", "+", "+", "+", "+", "G1^{S342G}", 
"G1^{S342G}", "+", "+", "+", "+", "+", "+", "+", "+", "+", "+"
), G1_2_1 = c("Blank", "Blank", "+", "+", "+", "+", "G1^{I384M}", 
"G1^{I384M}", "+", "+", "G1^{I384M}", "G1^{I384M}", "Blank", 
"Blank", "+", "+", "+", "+", "+", "+", "G1^{I384M}", "G1^{I384M}", 
"+", "+", "Blank", "Blank", "+", "+", "G1^{I384M}", "G1^{I384M}", 
"G1^{I384M}", "G1^{I384M}", "G1^{I384M}", "G1^{I384M}", "G1^{I384M}", 
"G1^{I384M}", "Blank", "Blank", "+", "+", "G1^{I384M}", "G1^{I384M}", 
"G1^{I384M}", "G1^{I384M}", "+", "+", "G1^{I384M}", "G1^{I384M}", 
"G1^{I384M}", "G1^{I384M}", "+", "+", "+", "+", "+", "+", "G1^{I384M}", 
"G1^{I384M}", "+", "+", "G1^{I384M}", "G1^{I384M}", "+", "+", 
"Blank", "+", "+", "+", "+", "+", "+", "+", "+", "+", "G1^{I384M}", 
"G1^{I384M}", "G1^{I384M}", "G1^{I384M}", "+", "+", "+", "+", 
"+", "+", "G1^{I384M}", "G1^{I384M}", "G1^{I384M}", "G1^{I384M}", 
"+", "+", "+", "+", "+", "+", "G1^{I384M}", "G1^{I384M}"), G1_2_2 = c("Blank", 
"Blank", "+", "+", "+", "+", "+", "+", "+", "+", "+", "+", "Blank", 
"Blank", "+", "+", "+", "+", "+", "+", "+", "+", "+", "+", "Blank", 
"Blank", "+", "+", "+", "+", "+", "+", "+", "+", "+", "+", "Blank", 
"Blank", "+", "+", "+", "+", "+", "+", "+", "+", "+", "+", "+", 
"+", "+", "+", "+", "+", "+", "+", "G1^{I384M}", "G1^{I384M}", 
"+", "+", "+", "+", "+", "+", "Blank", "+", "+", "+", "+", "+", 
"+", "+", "+", "+", "G1^{I384M}", "G1^{I384M}", "+", "+", "+", 
"+", "+", "+", "+", "+", "G1^{I384M}", "G1^{I384M}", "+", "+", 
"+", "+", "+", "+", "+", "+", "+", "+"), G2_1 = c("Blank", "Blank", 
"+", "+", "+", "+", "G2", "G2", "+", "+", "G2", "G2", "Blank", 
"Blank", "+", "+", "G2", "G2", "G2", "G2", "+", "+", "+", "+", 
"Blank", "Blank", "G2", "G2", "+", "+", "+", "+", "+", "+", "+", 
"+", "Blank", "Blank", "G2", "G2", "G2", "G2", "+", "+", "+", 
"+", "+", "+", "G2", "G2", "G2", "G2", "+", "+", "+", "+", "+", 
"+", "+", "+", "+", "+", "+", "+", "+", "+", "G2", "G2", "G2", 
"G2", "G2", "G2", "G2", "G2", "+", "+", "+", "+", "+", "+", "+", 
"+", "G2", "G2", "+", "+", "+", "+", "G2", "G2", "+", "+", "+", 
"+", "+", "+"), G2_2 = c("Blank", "Blank", "+", "+", "+", "+", 
"+", "+", "+", "+", "+", "+", "Blank", "Blank", "+", "+", "+", 
"+", "+", "+", "+", "+", "+", "+", "Blank", "Blank", "+", "+", 
"+", "+", "+", "+", "+", "+", "+", "+", "Blank", "Blank", "+", 
"+", "+", "+", "+", "+", "+", "+", "+", "+", "+", "+", "+", "+", 
"+", "+", "+", "+", "+", "+", "+", "+", "+", "+", "+", "+", "+", 
"+", "+", "+", "+", "+", "+", "+", "+", "+", "+", "+", "+", "+", 
"+", "+", "+", "+", "+", "+", "+", "+", "+", "+", "+", "+", "+", 
"+", "+", "+", "+", "+"), `Final genotype of APOL1` = c("NA", 
"NA", "G0/G0", "G0/G0", "G0/G0", "G0/G0", "G1^{GM}/G2", "G1^{GM}/G2", 
"G0/G0", "G0/G0", "G1^{GM}/G2", "G1^{GM}/G2", "NA", "NA", "G0/G0", 
"G0/G0", "G0/G2", "G0/G2", "G0/G2", "G0/G2", "G1^{GM}/G0", "G1^{GM}/G0", 
"G0/G0", "G0/G0", "NA", "NA", "G0/G2", "G0/G2", "G1^{GM}/G0", 
"G1^{GM}/G0", "G1^{GM}/G0", "G1^{GM}/G0", "G1^{GM}/G0", "G1^{GM}/G0", 
"G1^{GM}/G0", "G1^{GM}/G0", "NA", "NA", "G0/G2", "G0/G2", "G1^{GM}/G2", 
"G1^{GM}/G2", "G1^{GM}/G0", "G1^{GM}/G0", "G0/G0", "G0/G0", "G1^{GM}/G0", 
"G1^{GM}/G0", "G1^{GM}/G2", "G1^{GM}/G2", "G0/G2", "G0/G2", "G0/G0", 
"G0/G0", "G0/G0", "G0/G0", "G1^{GM}/G1^{GM}", "G1^{GM}/G1^{GM}", 
"G0/G0", "G0/G0", "G1^{GM}/G0", "G1^{GM}/G0", "G0/G0", "G0/G0", 
NA, "G0/G0", "G0/G2", "G0/G2", "G0/G2", "G0/G2", "G0/G2", "G0/G2", 
"G0/G2", "G0/G2", "G1^{GM}/G0", "G1^{GM}/G0", "G1^{GM}/G0", "G1^{GM}/G0", 
"G0/G0", "G0/G0", "G0/G0", "G0/G0", "G0/G2", "G0/G2", "G1^{GM}/G1^{GM}", 
"G1^{GM}/G1^{GM}", "G1^{GM}/G0", "G1^{GM}/G0", "G0/G2", "G0/G2", 
"G0/G0", "G0/G0", "G0/G0", "G0/G0", "G1^{GM}/G0", "G1^{GM}/G0"
), `no APOL1 Risk Alleles` = c(NA, NA, 1, 1, 1, 1, NA, NA, 1, 
1, NA, NA, NA, NA, 1, 1, NA, NA, NA, NA, NA, NA, 1, 1, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, 1, 1, NA, NA, NA, NA, NA, NA, 1, 1, 1, 1, NA, NA, 1, 
1, NA, NA, 1, 1, NA, 1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, 1, 1, 1, 1, NA, NA, NA, NA, NA, NA, NA, NA, 1, 1, 1, 
1, NA, NA), `1 APOL1 Risk Alleles` = c(NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, 1, 1, 1, 1, 1, NA, 
NA, NA, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, NA, 1, 1, NA, NA, 
1, 1, NA, NA, 1, 1, NA, NA, 1, 1, NA, NA, NA, NA, NA, NA, NA, 
NA, 1, 1, NA, NA, NA, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
NA, NA, NA, NA, 1, 1, NA, NA, 1, 1, 1, 1, NA, NA, NA, NA, 1, 
1), `2 APOL1 Risk Alleles` = c(NA, NA, NA, NA, NA, NA, 1, 1, 
NA, NA, 1, 1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
1, 1, NA, NA, NA, NA, NA, NA, 1, 1, NA, NA, NA, NA, NA, NA, 1, 
1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, 1, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA), Sample_Flag = c(FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE)), row.names = c(NA, -96L), class = "data.frame")

кадр данных (Summary_table)

structure(list(X__1 = c("Total number", "Percentage", "G1/G1 %", 
"G2/G2 %", "G1/G2 %", "G0/G1 %", "G0/G2 %"), `no APOL1 Risk Alleles` = c(29, 
33.33, NA, NA, NA, NA, NA), `1 APOL1 Risk Alleles` = c(46, 52.88, 
NA, NA, NA, 27.59, 25.29), `2 APOL1 Risk Alleles` = c(12, 13.79, 
4.6, NA, 9.19, NA, NA), `Total Number` = c(87, NA, NA, NA, NA, 
NA, NA)), row.names = c(NA, -7L), class = c("tbl_df", "tbl", 
"data.frame"))

person Community    schedule 30.01.2020    source источник
comment
(1) Пожалуйста, научитесь лучше редактировать свой вопрос. Посмотрите на мое редактирование для некоторых подсказок, но то, как вы изначально его структурировали, некоторые из ваших данных были скрыты, что делало образцы данных непригодными для использования. stackoverflow.com/editing-help#syntax-highlighting. (2) Пожалуйста, прочитайте о тегах, которые вы прикрепляете к вопросу (не просто добавляйте много), ни datatables (подключаемый модуль для jQuery) и структуры данных (организация данных для запросов) не относятся к конкретным необходимо или применимо к этому вопросу. (3) Пожалуйста, отвечайте по одному вопросу за раз: изменение формы данных. После изменения формы write.csv сохранит ваши данные.   -  person r2evans    schedule 01.02.2020
comment
Почему в ваших данных есть как буквальные "NA", так и символические NA? Являются ли Total number (и строка, и столбец) предельной суммой? Что такое с G1_1_ по G2_2? Когда я пытаюсь придумать подсчеты/суммы, я не получаю ничего близкого к вашим ожидаемым итоговым результатам 108 или 161. Основана ли эта сводная структура на предоставленных вами примерах данных?   -  person r2evans    schedule 01.02.2020
comment
Привет, @ r2evans да, сводная таблица взята из предыдущего запуска, которую мой коллега по работе создал вручную. Цифры не должны совпадать с последней переменной генотипа APOL1, необходимой для сводной таблицы. Я добавил контекст кода для этого   -  person    schedule 03.02.2020
comment
@ r2evans вы получили мой предыдущий комментарий и обновление?   -  person    schedule 04.02.2020
comment
ДжорданБраун, это сложный вопрос для разбора. Я задал несколько вопросов о том, как создается сводная таблица, но в вопросе все еще неясно, и вы не ответили на них. В любом случае, когда вы ожидаете вывода в вопросе, это действительно помогает, когда он основан на демонстрационных данных, которые вы нам предоставляете, иначе для проверки нечего использовать.   -  person r2evans    schedule 04.02.2020
comment
@ r2evans извините за неясность вопроса. Я отредактировал и обновил данные сводной таблицы, чтобы они соответствовали демонстрационным данным.   -  person    schedule 04.02.2020


Ответы (1)


Как правило, я не сторонник хранения сводок по строкам (например, итога) внутри самого фрейма, так как любое последующее суммирование строк будет включать это число; Я предполагаю, что это чисто для эстетики, так что в том числе это не страшно

library(dplyr)

tmp1 <- as_tibble(Final_APOL_1) %>%
  # discard G* fields, they seem unnecessary?
  select(-starts_with("G")) %>%
  # remove an reference to NA or the literal string "NA", they seem distracting?
  filter(
    !is.na(`Final genotype of APOL1`),
    `Final genotype of APOL1` != "NA"
  ) %>%
  mutate(
    `X__1` = case_when(
      `Final genotype of APOL1` %in% c("G1^{GM}/G2", "G1^{G+}/G2") ~ "G1/G2",
      `Final genotype of APOL1` == "G1^{GM}/G1^{GM}"               ~ "G1/G1",
      `Final genotype of APOL1` %in% c("G1^{GM}/G0", "G1^{G+}/G0") ~ "G1/G0",
      TRUE ~ `Final genotype of APOL1`
    )
  ) %>%
  select(-Well, -`Final genotype of APOL1`, -Sample_Flag) %>%
  group_by(X__1) %>%
  summarize_all(~ sum(.))

totals <- tmp1 %>%
  summarize_at(vars(-X__1), ~ sum(., na.rm = TRUE)) %>%
  mutate(
    `Total Number` = sum(.),
    X__1 = "Total number"
  )
percents <- totals %>%
  mutate_at(vars(-X__1, -`Total Number`), ~ 100 * . / `Total Number`) %>%
  mutate(
    `Total Number` = NA_real_,
    X__1 = "Percentage"
  )

Заключительные шаги и вывод:

tmp1 %>%
  mutate_at(vars(-X__1), ~ 100 * . / totals$`Total Number`) %>%
  bind_rows(., totals, percents)
# # A tibble: 7 x 5
#   X__1         `no APOL1 Risk Allele~ `1 APOL1 Risk Allele~ `2 APOL1 Risk Allele~ `Total Number`
#   <chr>                         <dbl>                 <dbl>                 <dbl>          <dbl>
# 1 G0/G0                          33.3                  NA                   NA                NA
# 2 G0/G2                          NA                    25.3                 NA                NA
# 3 G1/G0                          NA                    27.6                 NA                NA
# 4 G1/G1                          NA                    NA                    4.60             NA
# 5 G1/G2                          NA                    NA                    9.20             NA
# 6 Total number                   29                    46                   12                87
# 7 Percentage                     33.3                  52.9                 13.8              NA
person r2evans    schedule 04.02.2020