DataTable列表对比:筛选当前行首元素与前一行末元素不匹配的记录
解决方法
嘿,我来帮你搞定这个DataTable的筛选问题!咱们一步步来,思路很清晰:
首先,你的peoplecount列是逗号分隔的字符串,得先把它拆成单独的数值元素,才能提取第1个和第4个值来做比较。用data.table自带的tstrsplit函数就能轻松完成拆分:
library(data.table) # 把peoplecount拆成4个数值列p1-p4 data[, c("p1", "p2", "p3", "p4") := tstrsplit(peoplecount, ",", type.convert = TRUE)]
这里type.convert=TRUE会自动把拆分后的字符串转成数值型,省去了手动转类型的麻烦。
接下来,我们需要拿到每一行前一行的第4个元素,data.table的shift()函数正好是干这个的——它默认会取上一行的滞后值,第一行因为没有前一行,会返回NA:
# 添加一列存储前一行的第4个元素 data[, prev_p4 := shift(p4)]
现在就可以筛选符合条件的记录了:我们要找的是当前行第1个元素≠前一行第4个元素的行,同时要排除第一行(因为它没有前一行,prev_p4是NA):
# 筛选目标记录 target_rows <- data[p1 != prev_p4 & !is.na(prev_p4)]
如果不想保留拆分出来的临时列,也可以用一步到位的写法(可读性稍弱,但不用新增列):
# 无需新增列的写法 target_rows <- data[, { # 提取当前行第1个元素 curr_p1 <- as.integer(strsplit(peoplecount, ",")[[1]][1]) # 提取前一行第4个元素 prev_p4 <- shift(sapply(peoplecount, function(x) as.integer(strsplit(x, ",")[[1]][4]))) # 返回符合条件的行 .SD[curr_p1 != prev_p4 & !is.na(prev_p4)] }]
用你的测试数据验证的话,第7行的p1是0,前一行(第6行)的p4是3,0≠3,所以会被成功筛选出来,完全符合你的需求~
内容的提问来源于stack exchange,提问作者mrtyormaa
相关产品推荐
相关产品推荐

