Создание новых переменных, описывающих существующую позицию индекса определенного значения

У меня есть фрейм данных в R со столбцом, содержащим уникальный идентификатор и 10 переменных, который выглядит так:

    id V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1  555  2  1 10  3  8  9  5  7  4   6
2  681 10  5  4  8  7  3  6  2  9   1
3 2300  8  5 10  2  3  1  6  9  4   7

Я хочу создать переменные с именами от or1 до or10, которые фиксируют положение столбца значений 1:10 для каждой строки.

Так, например, в первой строке число 1 появляется в столбце с именем V2, поэтому or1 = 2. Если бы мне удалось сделать это правильно для трех строк выше, я бы получил следующее:

    id or1 or2 or3 or4 or5 or6 or7 or8 or9 or10
1  555  2   1   4   9   7  10   8   5   6    3
2  681 10   8   6   3   2   7   5   4   9    1
3 2300  6   4   5   9   2   7  10   1   8    3  

Мне удалось создать or1, используя абсурдно длинный набор операторов if/then, но я знаю, что есть гораздо лучший способ, который, вероятно, включает индексацию. Вся помощь приветствуется.


person user2230555    schedule 01.04.2013    source источник


Ответы (1)


Это делает это:

> ord <- data.frame(id = dat$id, t(apply(dat[, -1], 1, order)))
    id X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1  555  2  1  4  9  7 10  8  5  6   3
2  681 10  8  6  3  2  7  5  4  9   1
3 2300  6  4  5  9  2  7 10  1  8   3

(Если «id» не является первым столбцом, я бы заменил dat[, -1] более надежным dat[!colnames(dat) %in% "id"])

Затем, чтобы получить имена столбцов точно так, как вы хотели:

colnames(ord) <- sub("^X", "or", colnames(ord))
person flodel    schedule 01.04.2013
comment
Святая корова, это эффективно! Большое спасибо флодель. - person user2230555; 01.04.2013