Группировка данных, затем заполнение столбца в R на основе сгруппированных данных - PullRequest
0 голосов
/ 22 января 2020

Для любой комбинации столбцов A, C, D, E, F и G, я пытаюсь найти значение столбца B, когда оно находится в пределах 5% от значения в столбце D. После того, как я нашел, я хотел бы вставить это значение в новый столбец, где бы ни находилась комбинация.

Вот пример данных, с которыми я работаю:

structure(list(A = c(500L, 10000L, 5000L, 500L, 100L, 500L, 1000L, 
10000L, 5000L, 1000L, 500L, 5000L, 100L, 5000L, 500L, 500L, 500L, 
1000L, 10000L, 500L), B = c(1.53147891704226, 5.51999984066968, 
1.69897000433602, 3.49996186559619, 2.8668778143375, 2.27415784926368, 
2.69983772586725, 4.30000820255381, 4.28000895310819, 1.14612803567824, 
3.40001963506516, 4.88000138832177, 2.3747483460101, 4, 3.03342375548695, 
3.04999285692014, 2.59988307207369, 3.51666755909904, 4.40000234592796, 
2.82477646247555), C = c(0.118917162666339, 32.46875, 0.00120927734375, 
6.69645182291667e-06, 38.1009114583333, 0.03888505859375, 0.984812890625, 
181.953125, 0.0079256796875, 0.0397203010315885, 1.693359375, 
0.25630859375, 0.00419210611979167, 1.4658203125, 0.00764973958333333, 
0.294973113716194, 8.8974609375, 0.0014642802734375, 67.609375, 
0.00205580344395639), D = c(4.63125661725864, 34.1632795742744, 
0.262987871586425, 9.53427792464916e-06, 38.7106620745277, 0.187395038620314, 
0.99014163328848, 211.108639904501, 0.0108561099088211, 9.82604248822947, 
1.95692192890506, 0.262987871586425, 0.00616933538501461, 2.23297962243741, 
0.020686261349356, 0.53228350287947, 26.4570757028734, 0.00221508528097736, 
68.1735822402243, 0.00495578134094092), E = c(2, 2, 2, 100, 2, 
100, 2, 2, 100, 2, 2, 2, 2, 100, 100, 2, 2, 100, 100, 2), F = c(1e-05, 
1e-06, 1e-07, 1e-08, 1e-05, 1e-06, 1e-04, 1e-05, 1e-06, 1e-05, 
1e-06, 1e-07, 1e-07, 1e-07, 1e-08, 1e-06, 1e-06, 1e-06, 1e-05, 
1e-08), G = c("Effective Number of Haplotypes", "Number of Polymorphic Sites", 
"Gene Diversity", "Nucleotide Diversity", "Number of Heterozygotes", 
"Gene Diversity", "Gene Diversity", "Number of Polymorphic Sites", 
"Nucleotide Diversity", "Effective Number of Haplotypes", "Number of Haplotypes", 
"Gene Diversity", "Gene Diversity", "Number of Haplotypes", "Number of Polymorphic Sites", 
"Effective Number of Haplotypes", "Number of Heterozygotes", 
"Nucleotide Diversity", "Number of Heterozygotes", "Effective Number of Haplotypes"
)), .Names = c("A", "B", "C", "D", "E", "F", "G"), row.names = c("11025", 
"13649", "37612", "178511", "9864", "15883", "2469", "7104", 
"15089", "11140", "18719", "47812", "36151", "31315", "66810", 
"17609", "16501", "14975", "10860", "45318"), class = "data.frame")

Рабочая строка кода, которую я имею:

min(df[which(df$C>=(0.05*df$D) & df$G == 'Nucleotide Diversity' & df$F==1e-6 & df$A==5000 & df$E==100),]$B) Возвращает одно нужное число для комбинации столбцов A, C, D, E, F и G.

Проблема / Вопрос 1: Я застрял при вставке этого числа в новый столбец H, где можно найти все комбинации A, C, D, E, F и G.

Проблема / вопрос 2: Существует ли автоматический способ сделать это без добавления значений для df$G==, df$F==, df$A== и df$E==?

Идеальный результат

A       B         C           D          E   F                   G                        H
500 1.531479 1.189172e-01 4.631257e+00   2   1e-05     Effective Number of Haplotypes
10000 5.520000 3.246875e+01 3.416328e+01   2   1e-06    Number of Polymorphic Sites
5000 1.698970 1.209277e-03 2.629879e-01   2   1e-07                 Gene Diversity
5000 3.499962 6.696452e-06 9.534278e-06  100   1e-06           Nucleotide Diversity         4.280009
100 2.866878 3.810091e+01 3.871066e+01   2   1e-05        Number of Heterozygotes
500 2.274158 3.888506e-02 1.873950e-01  100   1e-06                 Gene Diversity
1000 2.699838 9.848129e-01 9.901416e-01   2   1e-04                 Gene Diversity
10000 4.300008 1.819531e+02 2.111086e+02   2   1e-05    Number of Polymorphic Sites
5000 4.280009 7.925680e-03 1.085611e-02  100   1e-06           Nucleotide Diversity        4.280009
...

Я бы предположил, что есть способ сделать это, но термин, который я должен искать, мне не понятен.

1 Ответ

1 голос
/ 22 января 2020

Вы имеете в виду что-то подобное?

library(dplyr)
df %>% group_by(A, G) %>% mutate(H = min(B[C >= 0.05 * D]))

Возвращает минимальное значение B, где значение C больше, чем равно 5% от D. Может быть, вы хотите добавить больше переменных в group_by.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...