如何使用共享的第三列从最低到最高对第四列中的 id 组合进行排名?

How to rank in a fourth column a combination of ids using a shared third column from lowest to highest?

编辑:使用如下所示的勾选答案的修改版本

data1 <- data %>% group_by(pitch_2) %>% mutate(rank = order(euclid_dist))

原创----

我的数据框中有一对来自我的时间范围(超过 8000 万)的所有可能的音高组合——在 pitch_1 下是一个 ID,在 pitch_2 下是另一个 ID 和第三列euclid_dist 衡量一个音高与另一个音高的接近程度——我想在我的数据框中创建第四列,我在其中按最低数字(最佳匹配)到最高数字对组合进行排名。

我希望相对于 pitch_2 中具有相同主音高的其他组合进行排名。因此,与与相同 pitch_2 进行比较的所有其他 pitch_1 相比,他们将 pitch_1 下的音高排在第一位。

这只是我的数据的概览

> head(data)
    pitch_1   pitch_2 euclid_dist
2 400010-FF 493247-SI    3.631515
3 493247-SL 493247-SI    3.125729
4 349193-FT 493247-SI    4.619143
5 150037-FF 493247-SI    4.137001
6 218596-FF 493247-SI    2.536352
7 218596-SI 493247-SI    1.438356

使用那个小子集上的排名,我得到了我想要的数据,但不知道如何将它扩展到我的大数据框,其中有 pitch_2 个 [=14] =]

data$rank <-  rank(data$euclid_dist)

我希望它看起来像什么(有一些您看不到的行填充了其他行列)

    pitch_1   pitch_2 euclid_dist rank
2 400010-FF 493247-SI    3.631515    7
3 493247-SL 493247-SI    3.125729    6
4 349193-FT 493247-SI    4.619143   10
5 150037-FF 493247-SI    4.137001    8
6 218596-FF 493247-SI    2.536352    4
7 218596-SI 493247-SI    1.438356    1

使用 dplyr s 变异 + 顺序:

df <- data_frame(x = c(100, 300, 400, 50, 20, 600))

df <- df %>% mutate(xx = order(x))

你可以这样做-

> library(data.table)
> setDT(dt)[,rank:=rank(euclid_dist)]

输出-

> dt
     pitch_1   pitch_2 euclid_dist rank
1: 400010-FF 493247-SI    3.631515    4
2: 493247-SL 493247-SI    3.125729    3
3: 349193-FT 493247-SI    4.619143    6
4: 150037-FF 493247-SI    4.137001    5
5: 218596-FF 493247-SI    2.536352    2
6: 218596-SI 493247-SI    1.438356    1

输入-

dt <- read.table(text=' pitch_1   pitch_2 euclid_dist
2 400010-FF 493247-SI    3.631515
3 493247-SL 493247-SI    3.125729
4 349193-FT 493247-SI    4.619143
5 150037-FF 493247-SI    4.137001
6 218596-FF 493247-SI    2.536352
7 218596-SI 493247-SI    1.438356',header=T)