使用ddply选择组的最小值

时间:2012-03-16 18:17:46

标签: r plyr

我的数据框架如下所示

 TFexp
             ID Entrez_Gene_ID Symbol  adj.P.Val     P.Value          t         B       logFC GSM507414
  ILMN_1765574           7020 TFAP2A 0.03071446 0.001797766 -5.9919321 -1.012015 -1.02847949  9.537218
  ILMN_2374115           7020 TFAP2A 0.03914067 0.002813079 -5.4197845 -1.517871 -0.75604907  6.776104
  ILMN_1749838           7593  ZNF42 0.12390434 0.021504872 -3.2861751 -3.807814 -0.48844495  8.586840
  ILMN_2181540           7528    YY1 0.21007443 0.054908628  2.4869982 -4.834348  0.31190866 10.404929
  ILMN_1733135           7020 TFAP2A 0.22665655 0.063170290 -2.3738597 -4.984464 -0.82238355  3.827819
  ILMN_1670816           7593  ZNF42 0.44843565 0.220579380  1.3975294 -6.251177  1.60730795  2.963474
  ILMN_1770892           7528    YY1 0.47245442 0.243567365  1.3198784 -6.343075  0.16865034 10.903882
  ILMN_2275760           7020 TFAP2A 0.72242186 0.532549376 -0.6695509 -6.978362 -0.52387868  3.392317
  ILMN_1676010           6667    SP1 0.75701851 0.581434509  0.5886784 -7.034562  0.07281042  7.846117
  ILMN_2282477           7020 TFAP2A 0.95496669 0.907458427 -0.1221984 -7.225401 -0.02493289  6.903279

Symbol的每个级别中,我想选择min,并从这些最小值构造一个新的数据框。 我试过这个

ddply(TFexp, .(Symbol), function(x)x[x$P.Value==min(x$P.Value)])

但是这返回了以下内容:

             ID Entrez_Gene_ID Symbol adj.P.Val    P.Value          t         B      logFC GSM507414 GSM507415
1  ILMN_1676010           6667    SP1 0.7570185 0.58143451  0.5886784 -7.034562 0.07281042  7.846117  7.920055
2  ILMN_1765574           <NA>   <NA>        NA         NA -5.9919321        NA         NA        NA        NA
3  ILMN_2374115           <NA>   <NA>        NA         NA -5.4197845        NA         NA        NA        NA
4  ILMN_1733135           <NA>   <NA>        NA         NA -2.3738597        NA         NA        NA        NA
5  ILMN_2275760           <NA>   <NA>        NA         NA -0.6695509        NA         NA        NA        NA
6  ILMN_2282477           <NA>   <NA>        NA         NA -0.1221984        NA         NA        NA        NA
7  ILMN_2181540           <NA>    YY1        NA 0.05490863         NA -4.834348         NA 10.404929        NA
8  ILMN_1770892           <NA>    YY1        NA 0.24356737         NA -6.343075         NA 10.903882        NA
9  ILMN_1749838           <NA>  ZNF42        NA 0.02150487         NA -3.807814         NA  8.586840        NA
10 ILMN_1670816           <NA>  ZNF42        NA 0.22057938         NA -6.251177         NA  2.963474        NA

任何想法?
干杯,
戴维。

2 个答案:

答案 0 :(得分:3)

(未测试的)

ddply(TFexp, .(Symbol), function(x)x[which.min(x$P.Value),])

这两个变化:

  1. 在行选择条件之后添加,以使其实际成为 行选择。
  2. 从逻辑比较中更改了选择,以避免浮点数比较出现问题的可能性。

答案 1 :(得分:2)

那是因为x[x$P.Value==min(x$P.Value)]正在选择data.frame的一列,而不是一行。请改用x[x$P.Value==min(x$P.Value),]。更好的是,使用x[which.min(x$P.Value),]