如何在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
相关产品推荐
相关产品推荐

