Сложное зацикливание или функция в R

#r

Вопрос:

Поэтому я недавно начал писать код в целом, и я застрял здесь на несколько дней.

В простом масштабе у меня есть два кадра данных, и практически все, что мне нужно сделать, это

(moduletotals$Freq[3] - totals_df$Freq[1])

вычитание всего модуля darkorange, кластера 1 из частоты «биосинтеза 2′-дезоксирибонуклеотидов» в кластере 1 модуля darkorange для каждой строки totals_df .

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

 > moduletotals$module == totals_df$module amp; 
    moduletotals$cluster == totals_df$cluster 
 

выведите freq найденную строку и вычтите ее из частоты рассматриваемой строки totals_df

и я здесь совершенно потерялся.

модульные итоги

модуль скопление Част.
темно-зеленый 1 12
темно-серый 1 408
даркоранж 1 355
даркред 1 11
темно-синий 1 12
Серый 1 22

итоговые_df

Описание класса модуль скопление Част.
биосинтез 2′-дезоксирибонуклеотидов даркоранж 1 1
биосинтез 2′-дезоксирибонуклеотидов темно-серый 2 1
биосинтез 2′-дезоксирибонуклеотидов даркоранж 2 3
Адаптации и нетипичные условия даркоранж 1 1
Адаптации и нетипичные условия темно-серый 2 1
Аэробный темно-серый 1 4
Аэробный даркоранж 1 3
Аэробный серый 60 1 2
Аэробный светловолосый 1 3
Аэробный королевский блю 1 1

Ответ №1:

Вы можете делать left_join между таблиц данных:

 library(tidyverse)

module <- data.frame(
  stringsAsFactors = FALSE,
  module = c(
    "darkgreen",
    "darkgrey",
    "darkorange",
    "darkred",
    "darkturquoise",
    "grey"
  ),
  cluster = c(1L, 1L, 1L, 1L, 1L, 1L),
  freq = c(12L, 408L, 355L, 11L, 12L, 22L)
)

totals <- data.frame(
  stringsAsFactors = FALSE,
  class_description = c(
    "Adaptions and atypical conditions",
    "Adaptions and atypical conditions",
    "Aerobic",
    "Aerobic",
    "Aerobic",
    "Aerobic",
    "Aerobic"
  ),
  module = c(
    "darkorange",
    "darkgrey",
    "darkgrey",
    "darkorange",
    "grey60",
    "lightyellow",
    "royalblue"
  ),
  cluster = c(1L, 2L, 1L, 1L, 1L, 1L, 1L),
  freq = c(1L, 1L, 4L, 3L, 2L, 3L, 1L)
)

totals %>%
  left_join(module,
            by = c("module", "cluster")) %>%
  replace_na(list(freq.y = 0))
#>                   class_description      module cluster freq.x freq.y
#> 1 Adaptions and atypical conditions  darkorange       1      1    355
#> 2 Adaptions and atypical conditions    darkgrey       2      1      0
#> 3                           Aerobic    darkgrey       1      4    408
#> 4                           Aerobic  darkorange       1      3    355
#> 5                           Aerobic      grey60       1      2      0
#> 6                           Aerobic lightyellow       1      3      0
#> 7                           Aerobic   royalblue       1      1      0


module %>%
  left_join(
    totals %>%
      group_by(module, cluster) %>%
      summarise(freq = sum(freq),
                .groups = "drop"),
    by = c("module", "cluster")
  ) %>%
  replace_na(list(freq.y = 0))
#>          module cluster freq.x freq.y
#> 1     darkgreen       1     12      0
#> 2      darkgrey       1    408      4
#> 3    darkorange       1    355      4
#> 4       darkred       1     11      0
#> 5 darkturquoise       1     12      0
#> 6          grey       1     22      0
 

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

1. Огромное спасибо. Это очень помогло, иногда вам нужна только другая перспектива