2013-11-16 5 views
2

Учитывая data.table, как показано ниже, я хотел бы создать новый столбец, который является value по сумме по региону и где period == 0.data.table группа с условием фильтра

region period value 
1:  US  0 10 
2:  US  1 11 
3: Japan  0 12 
4: Japan  1 13 

Типичный data.frame подход к этому должен был бы создать отдельный кадр, фильтр по периоду, сумму по регионам, а затем объединить с оригиналом рамки с region в качестве ключа. Мне интересно, есть ли однолинейный подход в data.table с использованием синтаксиса группы data.table. Ближе всего я пришел к двухлинейному подходу ниже.

x1 <- data.table(
    region=c("US","US","Japan","Japan"), 
    period=c(0,1,0,1), 
    value=10:13) 

x1[period==0,value0:=sum(value),by=region] 
x1[,value0:=min(value0,na.rm=T),by=region] 


    region period value value0 
1:  US  0 10  10 
2:  US  1 11  10 
3: Japan  0 12  12 
4: Japan  1 13  12 

ответ

4

Я не уверен, если это «data.table» путь, но вы можете попробовать что-то вроде этого:

x1[, value0 := sum(value[period == 0]), by = region] 
x1 
# region period value value0 
# 1:  US  0 10  10 
# 2:  US  1 11  10 
# 3: Japan  0 12  12 
# 4: Japan  1 13  12 
2

Я предпочитаю путь Ананды, но вот альтернатива:

x1[x1[period==0,sum(value),by=region], value0 := V1, on="region", by=.EACHI] 
0

Это делает GROUPWISE область видимости более четко ...

> x1[,value0:=.SD[period==0,mean(value)],by=region]                                 
> x1                                             
    region period value value0                                      
1:  US  0 10  10                                      
2:  US  1 11  10                                      
3: Japan  0 12  12                                      
4: Japan  1 13  12 
+1

Обратите внимание, что '.SD' еще не оптимизирован для' .SD [x ==.] '. Это будет намного медленнее (попробуйте увеличить данные). Кроме того, требование OP - 'sum', а не' mean' (IIUC). – Arun

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