You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在data.table中实现%in%向量化操作?避免循环且不拆分列

无循环实现data.table逐行判断元素是否在列表列中

当然有更高效的无循环解法啦!针对你这个data.table场景,我们可以利用R的矢量化操作搞定,完全不用写循环,而且不会拆分upStocks列,完美适配后续要做滚动连接的需求~

首先先确认你的原始数据:

library(data.table)
stocks = data.table(date = c('2000-01-01', '2001-01-01'), 
                    upStocks = list(c('A','B'), c('A','C')), 
                    myStock = c('B','B'))

解法1:用mapply矢量化判断

直接在data.table语法里调用mapply,逐行传入upStocks和myStock进行判断:

stocks[, result := mapply(function(stock_list, target) target %in% stock_list, upStocks, myStock)]

解法2:用Map结合unlist

Map是mapply的简化版,返回结果是列表,我们用unlist转成逻辑向量即可:

stocks[, result := unlist(Map(`%in%`, myStock, upStocks))]

两种方法得到的结果完全一致,执行后你的stocks表会新增result列,就是你需要的判断结果:

stocks
#        date upStocks myStock result
# 1: 2000-01-01    A,B       B   TRUE
# 2: 2001-01-01    A,C       B  FALSE

这两种方式都是矢量化操作,比循环高效得多,而且全程不会拆分upStocks列,完全不影响后续的滚动连接操作哦~

内容的提问来源于stack exchange,提问作者jf328

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:55:15