2017-07-04 62 views
1

我有一個數據幀df選擇基於其他兩列的行r

df = data.frame(L = rep(letters[1:6], each = 2), 
       M = rep(letters[7:12]), 
       freq = sample(c(5, 10), replace = FALSE)) 

    L M freq 
1 a g 5 
2 a h 10 
3 b i 5 
4 b j 10 
5 c k 5 
6 c l 10 
7 d g 5 
8 d h 10 
9 e i 5 
10 e j 10 
11 f k 5 
12 f l 10 

我想選擇每個L.

在這個例子中,最常見的M上的輸出將顯示:

h, j, l, h, j, l 

頻率不一定是實際問題中的每秒鐘的值。

我該如何輕鬆做到這一點?

我試過tapply的方法,但在這裏卡住,因爲這似乎只適用於變量,不能用於子集的子集數據框。 (這並沒有導致任何接近,所以我不會發布方式)

+2

除了來自鏈接問題的基本R選項之外,還有一個基礎R選項,其中包括(df [order(-df $ freq),],M [!duplicated( L)])' –

+0

@docendodiscimus可能會在目標帖子中添加/更新答案? – zx8754

回答

1

使用dplyr

df %>% group_by(L) %>% top_n(1, freq) %>% .$M 
#### [1] h j l h j l 
另一種解決方案0

最終轉換成字符在結尾處...

+3

從'dplyr' v0.7開始,你可以使用更習慣的'...%>%pull(M)'而不是'...%>%。$ M' –

2

我們可以做

library(data.table) 
setDT(df)[, .(M = M[which.max(freq)]), L] 
# L M 
#1: a h 
#2: b j 
#3: c l 
#4: d h 
#5: e j 
#6: f l 

或者order的「頻率」,選擇每種第一「M」 'L'

setDT(df)[order(-freq), .(M = M[1]) , L]