R:从组

时间:2017-09-14 16:16:18

标签: r data.table

我有一个data.frame(或data.table),如下所示

Col1  Col2  Col3
1      A     23
1      B     26
2      A     20
2      C     10

我将这些数据分组在Col1上。我想从每一行获得在一定范围内的行数(比如5;在Col3上计算的差异)。

所以我应该得到像这样的结果

Col1  Col2  Col3 Col4
1      A     23  1  
1      B     26  1
2      A     20  0
2      C     10  0

在这种情况下,基数是每行的Col3。因此,例如 - row1,Col3在组中有一行距离row1,Col3的距离在5以内。类似地,在第二组中没有任何行距离它们中的任何一个距离。

我怎么能在data.table中做到这一点?

2 个答案:

答案 0 :(得分:2)

ave(abs(ave(df$Col3,
            df$Col1,
            FUN = function(x) c(Inf, (x[1] - x)[-1]))) <= 5,
    df$Col1,
    FUN = sum)
#[1] 1 1 0 0

内部ave计算同一组内元素之间的差异。外ave计算绝对差值小于5的行数。

<强>更新

#DATA
df <- data.frame(Col1 = c(1,1,2,2,2), Col3 = c(24,25,21,20,10))

temp = ave(abs(ave(df$Col3,
            df$Col1,
            FUN = function(x) c(Inf, (x[1] - x)[-1]))) <= 5,
    df$Col1,
    FUN = sum)
replace(temp, abs(ave(df$Col3, df$Col1, FUN = function(x) c(0, (x[1] - x)[-1]))) > 5, 0)
#[1] 1 1 1 1 0

答案 1 :(得分:0)

我只是想通了。使用data.table和sapply。

df <- data.table(Col1 = c(1,1,2,2,2), Col3 = c(24,25,21,20,10))
df[,Col4 := sapply(Col3, function (y) (sum(abs(y - Col3)<=5)-1)), by = .(Col1)]