我有一个数据帧df
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
的方法,但卡在这里,因为这似乎仅适用于变量,不能用于子集数据框。(这没有导致任何接近,所以我不会发布该方法(
我们可以做
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
"频率"并为每个"L"选择第一个"M">
setDT(df)[order(-freq), .(M = M[1]) , L]
另一种使用dplyr
的解决方案
df %>% group_by(L) %>% top_n(1, freq) %>% .$M
#### [1] h j l h j l
最终在最后变成角色...