使用data.table在关系计数中不等于

时间:2018-10-24 16:13:31

标签: r data.table

我希望了解在给定特定类别变量的所有级别与记录值不匹配的情况下,如何使用data.table计算计数。

获取以下数据表。

df <- data.table(var1 = c('dog','cat','dog','cat','dog','dog','dog'),
             var2 = c(1,5,90,95,91,110,8),
             var3 = c('lamp','lamp','lamp','table','table','table','table'))

我想计算落在一个范围内并且与var1不共享相同值的值的计数。

这与Count of values within specified range of value in each row using data.table有关。为了引用@Jaap的答案,以下代码允许产生一定范围内的计数。

df[, var2withinrange := df[.(var2min = var2 - 5, var2plus = var2 + 5)
                       , on = .(var2 >= var2min, var2 <= var2plus)
                       , .N
                       , by = .EACHI][, N]][]

在尝试扩展此答案时,我成功要求var1与以下内容完全匹配:

df[, var2withinrange := df[.(var2min = var2 - 5, var2plus = var2 + 5, var1 = var1)
                       , on = .(var2 >= var2min, var2 <= var2plus, var1 = var1)
                       , .N
                       , by = .EACHI][, N]][]

下面的代码是我尝试计算var1的值不等于给定行中var1的值,但是此代码失败。

df[, var2withinrange := df[.(var2min = var2 - 5, var2plus = var2 + 5, var1 = var1)
                       , on = .(var2 >= var2min, var2 <= var2plus, var1 != var1)
                       , .N
                       , by = .EACHI][, N]][]

如何添加“不等于”类型的运算符?最好使用data.table的答案,但是当然可以使用dplyr中的解决方案或实际上任何替代方案!

1 个答案:

答案 0 :(得分:1)

在这种情况下,您可以执行以下操作:

df[.(var2min = var2 - 5, var2plus = var2 + 5, v1=var1)
    , on = .(var2 >= var2min, var2 <= var2plus)
    , sum(v1 != x.var1)
    , by = .EACHI]

输出:

   var2 var2 V1
1:   -4    6  1
2:    0   10  2
3:   85   95  1
4:   90  100  2
5:   86   96  1
6:  105  115  0
7:    3   13  1

总的来说,我认为您可以进行反加入。