Умножить значения кадров данных в 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}"))
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц....
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
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

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