我希望了解在给定特定类别变量的所有级别与记录值不匹配的情况下,如何使用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
中的解决方案或实际上任何替代方案!
答案 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
总的来说,我认为您可以进行反加入。