2016-12-16 42 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]