Умножить значения кадров данных в R

У меня есть два кадра данных, и я хочу применить формулу к значениям df1 (столбец 6 до второго последнего) со значениями второго столбца в df2 и сохранить их как новые столбцы в df1.

Данные:

df1 <- read.table(text = "
chr start   end strand  ref.bam bam1    bam2    bam3    bam4    bam5    bam6    bam7    bam8    length
chr1    3531569 3531966 -   128 2   2   1   4   8   36  21  1   397
chr1    3670538 3672624 -   1322    251 50  170 165 294 259 665 86  2086
chr1    4491645 4493854 -   1012    220 46  179 167 275 332 414 77  2209
chr1    4496542 4497750 -   155 115 41  100 67  114 69  42  63  1208
chr1    4571267 4572265 -   428 64  32  77  44  76  130 179 27  998
chr1    4688213 4688719 -   76  39  10  20  20  14  23  25  17  506", header = TRUE)

df2 <- read.table(text = "bam_file    total_dedup_reads
bam1    27220427
bam2    9347059
bam3    19711791
bam4    14089305
bam5    14677615
bam6    8762480
bam7    3510947
bam8    35326515", header = TRUE)

Я устал от этого, но я не получаю желаемых результатов.

x <-df1 %>% mutate(across(6:(ncol(df1)-1), 
                   ~(.x * 10^9)/(df2$total_dedup_reads[which(names(df1[ , c(6:(ncol(df1)-1))]) == cur_column())] * length),
                   .names = "pro_{.col}"))

x <-df1 %>% mutate(across(6:(ncol(df1)-1), 
                  ~(.x * 10^9)/(df2$total_dedup_reads[which(names(df1[ , c(6:(ncol(df1)-1))]) == cur_column())] * length),
                   .names = "pro_{.col}"))
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Измените форму от широкой к длинной, затем объедините, выполните вычисления и измените форму обратно от длинной к широкой:

df1 %>% 
pivot_longer(cols = starts_with("bam"), names_to = "bam_file", values_to = "x") %>% 
  left_join(df2, by = "bam_file") %>% 
  mutate(x = (x * 10^9) / total_dedup_reads / length) %>% 
  select(-total_dedup_reads) %>% 
  pivot_wider(names_from = bam_file, values_from = x)
  
## A tibble: 6 x 14
#   chr     start     end strand ref.bam length  bam1  bam2  bam3  bam4  bam5  bam6  bam7   bam8
#   <chr>   <int>   <int> <chr>    <int>  <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl>
# 1 chr1  3531569 3531966 -          128    397 0.185 0.539 0.128 0.715  1.37 10.3  15.1  0.0713
# 2 chr1  3670538 3672624 -         1322   2086 4.42  2.56  4.13  5.61   9.60 14.2  90.8  1.17  
# 3 chr1  4491645 4493854 -         1012   2209 3.66  2.23  4.11  5.37   8.48 17.2  53.4  0.987 
# 4 chr1  4496542 4497750 -          155   1208 3.50  3.63  4.20  3.94   6.43  6.52  9.90 1.48  
# 5 chr1  4571267 4572265 -          428    998 2.36  3.43  3.91  3.13   5.19 14.9  51.1  0.766 
# 6 chr1  4688213 4688719 -           76    506 2.83  2.11  2.01  2.81   1.89  5.19 14.1  0.951 

Вы можете использовать sweep, чтобы разделить матрицу на вектор. Предполагая, что имена совпадают по положению.

df1[6:13] <- sweep(df1[6:13]*10^9, 2, df2[,2], `/`) / df1$length

df1
#   chr   start     end strand ref.bam      bam1      bam2     bam3      bam4     bam5      bam6      bam7       bam8 length
#1 chr1 3531569 3531966      -     128 0.1850736 0.5389699 0.127786 0.7151216 1.372916 10.348680 15.066227 0.07130315    397
#2 chr1 3670538 3672624      -    1322 4.4204297 2.5643702 4.134362 5.6140990 9.602350 14.169627 90.799419 1.16703358   2086
#3 chr1 4491645 4493854      -    1012 3.6587441 2.2278561 4.110846 5.3657593 8.481672 17.152022 53.380219 0.98672064   2209
#4 chr1 4496542 4497750      -     155 3.4973248 3.6311312 4.199591 3.9365729 6.429577  6.518612  9.902802 1.47629388   1208
#5 chr1 4571267 4572265      -     428 2.3558872 3.4303975 3.914120 3.1291945 5.188330 14.865714 51.085567 0.76583009    998
#6 chr1 4688213 4688719      -      76 2.8315169 2.1143384 2.005180 2.8053684 1.885046  5.187406 14.072304 0.95103743    506

спасибо, но формула немного другая. (x * 10^9)/(total_dedup_reads * длина). Таким образом, для bam1 значение row1 должно быть 0,185 вместо 29169 > (2 * 10 ^ 9)/(27220427 * 397) [1] 0,1850736, когда я пробовал свой код, я получал «NAs, созданные целочисленным переполнением»

learner 14.02.2023 13:27

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

GKi 14.02.2023 13:41

Другие вопросы по теме