R:将 data.table 的列与向量进行比较

R: Compare a column of a data.table with a vector

我有一栏是data.table:

DT = data.table(R=c(3,8,5,4,6,7))

此外,我有一个簇 1、2、3 和 4 的簇上限矢量:

CP=c(2,4,6,8)

现在我想根据 CP 的顺序将 R 的每个条目与 CP 的元素进行比较。结果

DT[,NoC:=c(2,4,3,2,3,4)]

应该是DT中的一列NoC,它的条目就是R的元素所属的那个簇的编号。 (我需要簇号才能从另一个 data.table 中选择一个因子。)

以R的第1项为例:3不小于2(CP外),但小于4(CP外)。所以,3 属于第 2 组。

另一个例子,取R的第6项:7既不小于2、4也不小于6(CP外),但小于8(CP外)。所以,7 属于第 4 组。

如果不使用 if 子句,我该如何做到这一点?

您可以使用滚动连接完成此操作:

data.table(CP, key="CP")[DT, roll=-Inf, which=TRUE]
# [1] 2 4 3 2 3 4

roll=-Inf 执行 NOCB 滚动连接 - 下一个观察向后进行。也就是说,如果价值落入缺口,下一个观察值将向后滚动。例如:7 介于 6 和 8 之间。下一个值为 8 - 将向后滚动。我们只需使用 which=TRUE.

获取每个匹配项的相应索引

您可以使用 := 将其作为列添加到 DT,如您所示。

请注意,这将 return 索引 在排序后 CP。在您的示例中,CP 已经订购,因此 return 是预期的结果。如果 CP 尚未排序,您将必须添加一个额外的列并提取该列,而不是使用 which=TRUE。但我会留给你解决。

从你的描述来看,这似乎是提供正确答案的代码,但是最熟练的 data.tablistA​​run 似乎想出了一种完全不同的方式来满足你的期望,所以我认为必须有不同的方式来阅读您的要求。

> DT[ , NoC:= findInterval(R, c(0, 2,4,6,8) , rightmost.closed=TRUE)]
> DT
   R NoC
1: 3   2
2: 8   4
3: 5   3
4: 4   3
5: 6   4
6: 7   4

我也很疑惑findInterval是把第5项赋给第4个区间,因为6不大于第3个区间的上限(6)。