2017-02-15 11 views
0

У меня есть таблица данных с двумя переменными группировки. Я хочу рассчитать ранжирование относительно групповой переменной 1, сохраняя при этом информацию группы.Ранжирование внутри группы и сохранение идентификатора в R data.table

# require(data.table) 
# require(dplyr) 

set.seed(1) 
DT <- data.table(group = c(rep(1,5), rep(2, 5)), 
       id = c(letters[1:5], letters[1:5]), 
       var1 = rnorm(10), 
       var2 = runif(10)) 
# > DT 
#  group id  var1  var2 
# 1:  1 a -0.6264538 0.93470523 
# 2:  1 b 0.1836433 0.21214252 
# 3:  1 c -0.8356286 0.65167377 
# 4:  1 d 1.5952808 0.12555510 
# 5:  1 e 0.3295078 0.26722067 
# 6:  2 a -0.8204684 0.38611409 
# 7:  2 b 0.4874291 0.01339033 
# 8:  2 c 0.7383247 0.38238796 
# 9:  2 d 0.5757814 0.86969085 
# 10:  2 e -0.3053884 0.34034900 

я могу вычислить рейтинг внутри группы с помощью

DT[, lapply(.SD, function(x) percent_rank(x)), 
    .SDcols = c("var1", "var2"), by = .(group)] 

#  group var1 var2 
# 1:  1 0.25 1.00 
# 2:  1 0.50 0.25 
# 3:  1 0.00 0.75 
# 4:  1 1.00 0.00 
# 5:  1 0.75 0.50 
# 6:  2 0.00 0.75 
# 7:  2 0.50 0.00 
# 8:  2 1.00 0.50 
# 9:  2 0.75 1.00 
# 10:  2 0.25 0.25 

Я также хотел бы сохранить id колонку в новой таблице как

#  group id var1 var2 
# 1:  1 A 0.25 1.00 
# 2:  1 B 0.50 0.25 
# 3:  1 C 0.00 0.75 
# 4:  1 D 1.00 0.00 
# 5:  1 E 0.75 0.50 
# 6:  2 A 0.00 0.75 
# 7:  2 B 0.50 0.00 
# 8:  2 C 1.00 0.50 
# 9:  2 D 0.75 1.00 
# 10:  2 E 0.25 0.25 
+0

Вы можете просто поместить 'id' переменную в выборе тоже, хотя это немного неудобно. -' DT [с ((ID = идентификатор), lapply (.sd, percent_rank)), .SDcols = c ("var1", "var2"), by =. (Group)] ' – thelatemail

+0

@thelatemail Спасибо! Я не знаю, что я могу это сделать! –

+1

Или просто назначьте их обратно 'DT [, c (" var1 "," var2 "): = lapply (.SD, percent_rank), .SDcols = c (" var1 "," var2 "), by = group]' –

ответ

0

Использование data.table

DT[,`:=`(var1 = percent_rank(var1), 
     var2 = percent_rank(var2))] 

Использование dplyr

DT %>% mutate(var1 = percent_rank(var1), 
       var2 = percent_rank(var2)) 
+0

Не нужно ссылаться на 'DT $ ...', когда в dplyr - просто 'percent_rank (var1)' будет делать. – thelatemail

+0

@thelatemail Спасибо. Починил это! –