2016-05-09 2 views
1

У меня есть кадр данных с несколькими столбцами. Я хочу создать функцию/цикл или что может быть более эффективным, чтобы взять фрейм данных, заказать столбец, создать ранг переменной (с именем вроде rank_columnname) на основе этого порядка и добавить его в фрейм данных.Самый эффективный способ упорядочения столбцов и создания переменных ранга

dat <- data.frame(indi1=rnorm(10),indi2=rnorm(10)) 

dat1 <- dat[order(dat$indi1), ] 
dat1$rank_indi <- 1:nrow(dat) 
dat2 <- dat1[order(dat1$indi2), ] 
dat2$rank_indi2 <- 1:nrow(dat2) 

Этот пример делает то, что я хочу, но громоздким способом. Я пробовал использовать lapply, но я не могу обновить фрейм данных новым столбцом с похожим именем.

Любая помощь приветствуется.

+0

Вы можете уменьшить свой код 'SDAT $ rank_indi <- порядка ($ indi1 SDAT) '. Функция 'order' возвращает уже« ранжирующий »вектор. Для других решений см. Пакет 'data.table'. – Jimbou

+0

Кроме того, что-то вроде 'library (dplyr); dat%>% mutate_each (funs (dense_rank)) ' –

ответ

4

Вот простой цикл, чтобы вставить в "rank_indi" переменные:

for(i in names(dat)){ 
    dat[order(dat[,i]),paste0("rank_", i)] <- 1:nrow(dat) 
} 


dat 
     indi1  indi2 rank_indi1 rank_indi2 
1 1.45829065 -0.3322692   10   2 
2 0.55972129 2.5031318   7   10 
3 0.45870293 -0.6216859   6   1 
4 1.03814922 1.4284271   9   8 
5 -0.75211259 0.5600499   3   4 
6 -1.89298552 0.8047825   2   6 
7 0.03843679 0.6593377   5   5 
8 -0.09808913 0.2513729   4   3 
9 0.97862797 2.2650003   8   9 
10 -2.07767889 1.0684134   1   7 

редактировать: сделал ошибку в ранее коде