2016-12-16 39 views
1

跨越值进行匹配我想与基于列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 

我不在乎哪列有一个给定的字母中的最低值,我只需要最低值和字母列。

我想围绕写这个简单的包装我的头。这可能是重复的,但我不知道如何标题,并找不到任何材料或以前的问题如何做到这一点。

+0

'GROUP_BY(二,三,四)'?目前还不清楚你想要什么? – Psidom

+0

@Psidom例如,对于其中“m”在第2-4列中出现的所有行,它将在第1列中显示这些行的最低值,在第2列中显示这些行中的字母m,然后对每个字母执行此操作。 – Tunn

+1

你可以通过明确地显示给出的例子来阐明你的期望。 – Frank

回答

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 
+0

不错,认为这很容易。 – Tunn

2

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

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