2016-01-22 5 views
0

Я пытаюсь объединить множество манипуляций data.table в некоторый более быстрый код. Я создаю пример с меньшей таблицей данных. Я надеюсь, что у кого-то есть лучшее решение, чем неуклюжий (неловкий) код, который я разработал.Сложные данные.table подмножество и манипуляции

Для каждой группы, я хочу:

1) Проверьте есть как значение TRUE и FALSE, в колонке со, и если есть:

2) Вычесть значение х, соответствующее самым высоким значение V от каждого значения х в одной и той же группы и положить, что это число в новом столбце

Таким образом, в группе 3, если наивысший v значение равно 10, и в том же ряду х 0,212, я вычитал бы 0,212 из каждого значения x, соответствующего группе 3, и поместил бы это число в новый столбец

3) Удалите все строки, соответствующие группам без ИСТИНЫ и ЛОЖЬ в столбце w.

set.seed(1) 
test <- data.table(v=1:12, w=runif(12)<0.5, x=runif(12), 
y=sample(2,12,replace=TRUE), z=sample(letters[1:3],12,replace=TRUE)) 
setkey(test,y,z) 
test[,group:=.GRP,by=key(test)] 
+1

Что такое «неловко» попытку вы пробовали ? –

ответ

4

прикованная версия может выглядеть без необходимости установить ключ таблицы:

result <- test[ 
    # First, identify groups to remove and store in 'rowselect' 
    , rowselect := (0 < sum(w) & sum(w) < .N) 
    , by = .(y,z)][ 
    # Select only the rows that we need 
    rowselect == TRUE][ 
     # get rid of the temp column 
     , rowselect := NULL][ 
     # create a new column 'u' to store the values 
     , u := x - x[max(v) == v] 
     , by = .(y,z)] 

Результат выглядит следующим образом:

> result 
    v  w   x y z   u 
1: 1 TRUE 0.6870228 1 c 0.4748803 
2: 3 FALSE 0.7698414 1 c 0.5576989 
3: 7 FALSE 0.3800352 1 c 0.1678927 
4: 10 TRUE 0.2121425 1 c 0.0000000 
5: 8 FALSE 0.7774452 2 b 0.6518901 
6: 12 TRUE 0.1255551 2 b 0.0000000 
+0

блестящее и форматирование с комментариями – jangorecki

+0

@jangorecki, спасибо! Кодирование - это балансировка производительности и стиля :) –

Смежные вопросы