R: 将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元素所属集群的编号。(我需要集群号来从另一个数据表中选择一个因子。)

例如,以R:3的第一个条目不小于2(不在CP中),但小于4(不在CP中)为例。因此,3属于集群2。

另一个例子是,以R:7的第6个条目为例,它既不小于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中,如图所示。

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

根据您的描述,这似乎是提供正确答案的代码,但Arun,一个最熟练的data.tableist,似乎已经想出了一种完全不同的方法来满足您的期望,所以我认为一定有一种不同的方式来解读您的需求。

> 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不大于第三个区间(6)的上边界。

相关内容

  • 没有找到相关文章

最新更新