r语言 - 按特定列的数据表顺序创建新列不起作用



我有以下data.table

library (data.table)
dt <- structure(list(variable = c("var1", "var1", 
"var2", "var2", "var3", "var3", 
"var4", "var4", "var5", "var5"
), src = c("A", "B", 
"A", "B", 
"A", "B", 
"A", "B", 
"A", "B"
), effect = c(0.00479503189634099, 0.00520945223353099, 0.0414826536175954, 
0.0534395645078372, 0.00321202935447758, 0.00426201973099257, 
0.0207942299790097, 0.0268992334286609, 0.304833654398739, 0.291310303107859
)), .Names = c("variable", "src", "effect" ), class = c("data.table", "data.frame"), row.names = c(NA, -10L))

我希望按列对效果进行排名src.所以对于两个srcvariablevar5应该rank等于1(对于两个srcvar5具有最高的effect(。所以我跑

dt[, rank:=order(effect,  decreasing = T), by=c('src')]

但我得到

> dt
variable src       effect rank
1:     var1   A 0.0047950319    5
2:     var1   B 0.0052094522    5
3:     var2   A 0.0414826536    2
4:     var2   B 0.0534395645    2
5:     var3   A 0.0032120294    4
6:     var3   B 0.0042620197    4
7:     var4   A 0.0207942300    1
8:     var4   B 0.0268992334    1
9:     var5   A 0.3048336544    3
10:     var5   B 0.2913103031    3

任何想法为什么会发生这种情况?

使用dplyr

dt %>%
group_by(src) %>%
mutate(rank = dense_rank(desc(effect)))
# A tibble: 10 x 4
# Groups:   src [2]
variable src    effect  rank
<chr>    <chr>   <dbl> <int>
1 var1     A     0.00480     4
2 var1     B     0.00521     4
3 var2     A     0.0415      2
4 var2     B     0.0534      2
5 var3     A     0.00321     5
6 var3     B     0.00426     5
7 var4     A     0.0208      3
8 var4     B     0.0269      3
9 var5     A     0.305       1
10 var5     B     0.291       1

或与data.table

dt[, rank := rank(desc(effect)), by = list(src)]
variable src      effect rank
1:     var1   A 0.004795032    4
2:     var1   B 0.005209452    4
3:     var2   A 0.041482654    2
4:     var2   B 0.053439565    2
5:     var3   A 0.003212029    5
6:     var3   B 0.004262020    5
7:     var4   A 0.020794230    3
8:     var4   B 0.026899233    3
9:     var5   A 0.304833654    1
10:     var5   B 0.291310303    1

另一个数据表

setorder(dt, src, -effect)[, rank := 1:.N, by = src][]

最新更新