Как ранжировать в четвертом столбце комбинацию идентификаторов, используя общий третий столбец от самого низкого до самого высокого? - PullRequest
1 голос
/ 22 апреля 2019

edit: работает с измененной версией отмеченного ответа, как показано ниже

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

оригинал ----

У меня в моем фрейме данных есть пары всех возможных комбинаций высоты тона с моего таймфрейма (более 80 миллионов) - в pitch_1 - один идентификатор, а в pitch_2 - другой идентификатор с третьим столбцом euclid_dist - мера того, насколько близко один шаг к другой - и я хотел бы создать четвертый столбец в моем фрейме данных, где я ранжирую комбинации по наименьшему числу (наилучшее соответствие) на наибольшее.

Я хочу, чтобы ранжирование проводилось относительно других комбинаций с одинаковым основным шагом в pitch_2. Таким образом, они ранжируют высоту тона ниже pitch_1 по наименьшему числу по сравнению со всеми другими pitch_1, которые сравниваются с тем же pitch_2.

Вот только представление о том, как выглядят мои данные

> 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_2s

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

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

использование dplyr s mutate + заказ:

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

df <- df %>% mutate(xx = order(x))
0 голосов
/ 22 апреля 2019

Вы можете сделать что-то вроде этого -

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

output-

> 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

Input

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)
...