如何从R中的列中找到前n个最小值?

时间:2019-01-02 21:03:09

标签: r

我有这样一个命令,可以在e $ V2列中找到一个最小值。

EQTLs<-s[s$POS==as.numeric(e[tail(which(e$V2 == min(e$V2)), 1),1]),]

相反,我想查找与此相对的前10个最小值。

我尝试过,但是没有用:

EQTLs<-s[s$POS==as.numeric(e[tail(which(head(sort(e$V2),10), 1),1]),]

> head(e,20)
       V1           V2       V3       V4           V5           V6
 1: 179872750 2.176972e-01 34.75615 35.92840 -0.022011224 3.066414e-10
 2: 179873140 9.124538e-01 48.50275 48.52209 -0.001859901 1.702842e-12
 3: 179873673 4.592087e-05 33.15652 42.61323 -0.049702451 5.753929e-11
 4: 179873686 7.770025e-02 38.12148 40.26651 -0.025660347 1.234509e-09
 5: 179874581 9.088407e-01 51.70045 51.72127 -0.001846114 4.557570e-11
 6: 179875714 4.771981e-01 38.22935 38.70188 -0.011592859 1.319859e-10
 7: 179876164 8.203991e-02 35.42617 37.51915 -0.027269625 8.727276e-11
 8: 179876351 2.082161e-01 34.87287 36.08634 -0.022352006 3.967887e-11
 9: 179876509 2.079911e-01 34.87456 36.08902 -0.022389988 9.564772e-11
 10: 179876514 2.080461e-01 34.87454 36.08876 -0.022363648 1.265952e-11
 11: 179877324 3.353371e-02 37.78757 40.74353 -0.030421570 1.221123e-11
 12: 179877461 8.841961e-01 51.54780 51.57990 -0.002320621 1.055949e-10
 13: 179877493 8.521198e-01 51.74138 51.79103 -0.002830585 1.418604e-11
 14: 179877963 8.551982e-01 51.71526 51.76309 -0.002781394 1.221663e-10
 15: 179879790 5.040575e-01 42.38667 42.81348 -0.010884511 4.571836e-11
 16: 179879792 5.859217e-01 41.06875 41.37379 -0.009007441 3.462620e-10
 17: 179879794 6.934742e-01 41.10470 41.28307 -0.009437604 8.207510e-04
 18: 179879828 9.281022e-01 45.52744 45.54092  0.001941842 2.656116e-10
 19: 179879936 6.349573e-01 39.32128 39.56432  0.008749797 6.662635e-10
 20: 179880025 9.328145e-03 43.41904 47.62383  0.037273686 6.820883e-11

    > head(s,20)
                ID CHROM   POS
 1:    1_30923_G_T_b37     1 30923
 2:    1_51479_T_A_b37     1 51479
 3:    1_52058_G_C_b37     1 52058
 4:    1_52238_T_G_b37     1 52238
 5:    1_54490_G_A_b37     1 54490
 6:    1_54753_T_G_b37     1 54753
 7:    1_55164_C_A_b37     1 55164
 8:    1_55299_C_T_b37     1 55299
9:    1_55326_T_C_b37     1 55326
10:    1_57952_A_C_b37     1 57952
11:    1_58814_G_A_b37     1 58814
12:    1_61442_A_G_b37     1 61442
13:    1_61462_T_A_b37     1 61462
14:    1_63671_G_A_b37     1 63671
15: 1_63735_CCTA_C_b37     1 63735
16:    1_66162_A_T_b37     1 66162
17:    1_66331_A_C_b37     1 66331
18:    1_67181_A_G_b37     1 67181
19:    1_69511_A_G_b37     1 69511
20: 1_72297_G_GTAT_b37     1 72297

但是您可以忽略s表中的匹配一分钟,因为该数据子集不太可能使用。

1 个答案:

答案 0 :(得分:1)

我不太了解您的第一部分代码的逻辑,但是它似乎旨在提取名为s的数据框的行,其中包含名为V2的特定列,至少在名为e的其他数据框中存在。 (我无法弄清楚POS列应该扮演什么角色。因此,我假设您想要的是10行(以s为单位),其中e$V2假定它的十个最低值。这很简单:

 EQTLs <- s[ order(e$V2)[1:10] , ]

order函数返回原始值的位置,当将其作为数字索引应用于原始矢量时,这些位置会导致矢量排序。

我进一步猜测,您不能使用2个大得多的数据框的头部来测试此策略,因此,如果您想进行测试演示,则可能需要显示以下结果:

  dput( s[ order(s$V2)[1:20]  , ] ) # rows of s with 20 lowest V2 values
  dput( e[ order(s$V2)[1:20]  , ] ) # reproducible version of e with same row nums