我有一个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中做到这一点?
答案 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)]