2016-01-22 62 views
0

我想将很多data.table操作组合成一些更快的代码。我用一个较小的data.table创建了一个例子,我希望有人比我开发的笨重(令人尴尬的)代码有更好的解决方案。复杂的data.table子集和操作

对于每个组,我想:

1)确认存在既是TRUE和在柱瓦特FALSE,并且如果存在:

2)减去x的对应于最高值V值来自同一组中的x的每个 并且将该数字放在新列中

因此,在组3中,如果最高v值是10,并且在同一行x中是0.212, I将从对应于组3的每个x值中减去0.212,并将该数字放入新列

3)删除对应于在列w中既不为TRUE也不为FALSE的组的所有行。

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,谢谢!编码是关于平衡性能和风格:) –