多列中值的最小值匹配

时间:2016-12-16 21:49:08

标签: r dplyr

我想根据第2-4列的值返回第一列最小值的数据框:

df <- data.frame(one = rnorm(1000),
                 two = sample(letters, 1000, replace = T),
                 three = sample(letters, 1000, replace = T),
                 four = sample(letters, 1000, replace = T))

我能做到:

df_group <- df %>%
  group_by(two) %>%
  filter(one = min(one))

这让我得到了第二列中所有“m”的最低值,但是如果第三列或第四列在第一列中的“m”值较低呢?

输出应如下所示:

            one   two
1  -0.311609752   r
2   0.053166742   n
3   1.546485810   a
4  -0.430308725   d
5  -0.145428664   c
6   0.419181639   u
7   0.008881661   i
8   1.223517580   t
9   0.797273157   b
10  0.790565358   v
11 -0.560031797   e
12 -1.546234090   q
13 -1.847945540   l
14 -1.489130228   z
15 -1.203255034   g
16  0.146969892   m
17 -0.552363433   f
18 -0.006234646   w
19  0.982932856   s
20  0.751936728   o
21  0.220751258   h
22 -1.557436228   y
23 -2.034885868   k
24 -0.463354387   j
25 -0.351448850   p
26  1.331365941   x

我不关心哪一列具有给定字母的最低值,我只需要最低值和字母列。

我正试图简单地写下这个。这可能是重复的,但我不知道如何说出标题,也找不到任何关于如何做的材料或先前的问题。

2 个答案:

答案 0 :(得分:2)

另一种基于data.table的解决方案:

library(data.table)
setDT(df)
melt(df,
     measure=grep("one",names(df),invert = TRUE,value=TRUE))[
  ,min(one),value]

答案 1 :(得分:1)

您可以这样做:

library(dplyr); library(tidyr)

df %>% gather(cols, letts, -one) %>%        # gather all letters into one column
       group_by(letts) %>% 
       summarise(one = min(one))            # do a group by summary for each letter

# A tibble: 26 × 2
#   letts       one
#   <chr>     <dbl>
#1      a -2.092327
#2      b -2.461102
#3      c -3.055858
#4      d -2.092327
#5      e -2.461102
#6      f -2.249439
#7      g -1.941632
#8      h -2.543310
#9      i -3.055858
#10     j -1.896974
# ... with 16 more rows