如何在R中用data.table的dcast获取期望输出?聚合函数异常排查
解决data.table dcast聚合未得到预期结果的问题
我明白你想要实现的效果:每个id对应标记是否存在A或B类型的记录,不存在则标记为FALSE。你的代码思路是对的,只需要调整两个小地方就能得到预期输出:
问题分析
你当前的dcast代码里,fill=NA会让没有匹配的字段显示为NA,但你期望的是FALSE;另外,聚合函数可以简化得更直观。
修正后的代码
library(data.table) # 原始数据 a1 <- data.table(id=c(1,1,1,1,2,2,2,3,3), var=c("6402","1","6302","3","6406","6406","2","1","1")) b1 <- data.table(var=c("6402","6406","6302"), txt=c("A","B","A")) # 合并数据 mm <- b1[a1, on = .(var)] # 修正后的dcast:调整fill参数,简化聚合函数 # 若你的R版本低于4.1,把\(x)换成function(x)即可 result <- dcast(mm, id ~ txt, fun = \(x) any(!is.na(x)), fill = FALSE) # 查看结果 result # id A B # 1: 1 TRUE FALSE # 2: 2 FALSE TRUE # 3: 3 FALSE FALSE
更简洁的写法
你也可以先过滤掉txt为NA的行,再用any作为聚合函数,效果完全一致:
result <- dcast(mm[!is.na(txt)], id ~ txt, fun = any, fill = FALSE)
这样得到的结果就和你期望的desired_output完全匹配了。
内容的提问来源于stack exchange,提问作者Misha
相关产品推荐
相关产品推荐

