我有一个数据框叫做dat_new,实际上它是临床就诊数据,hrn是患者ID,dov是访问日期(每个人多次访问)。然后,我有一个名为event的数据框,其中包含有日期的住院记录(每个人多次入院)。
我想做的是,对于每个诊所访问,我想要求出在该诊所访问之前发生的住院记录总和,很简单。
这可以使用plyr中的ddply完成,需要一些时间但运行良好。
temp <- ddply(dat_new, .(hrn,dov), summarise,
dka2 = sum(event$event_code[which(event$hrn==hrn & event$doa <= dov)]==2),
dka3 = sum(event$event_code[which(event$hrn==hrn & event$doa <= dov)]==3),
dka8 = sum(event$event_code[which(event$hrn==hrn & event$doa <= dov)]==8)
)
现在,我试图用dplyr重写代码,但是出现了错误。
Error: binding not found: 'event_code'
我将其编码如下:
我已将其编码如下:
temp2 <- group_by(dat_new, hrn, dov)
temp3 <- summarise(temp2,
dka2 = sum(event$event_code[which(event$hrn==hrn & event$doa <= dov)]==2))
显然,event_code不在temp2数据框中。这是dplyr无法在“总结”时处理“其他”数据框的情况吗?如果有更好的方法来执行我正在进行的“查找/总和”,我会认真听取建议。
我试过几次,在vanilla R中以不同的顺序加载软件包,以尝试消除任何命名空间问题。
谢谢。
编辑-可重现的例子
这是一个简单而粗略的示例,仅用于说明问题。如果我们创建一个'lookup'数据框,其中每辆车都有两个mpg约为500,然后尝试查看原始数据框,在新数据框中查找并将两个mpg相加。 plyr给出了预期的答案,大约为1000。而dplyr则出现错误。
# add the model names as a column so they're easier to get at
mtcars$models <- row.names(mtcars)
# create a 'lookup' table
xtra <- data.frame(models = rep(row.names(mtcars),2),
newmpg = rnorm(2*nrow(mtcars),500,10)
)
xtra <- xtra[sample(row.names(xtra)), ]
library(plyr)
ddply(mtcars, .(models), summarise,
revisedmpg = sum(xtra$newmpg[models==xtra$models]) )
# great, one row per car, with both mpgs added together
library(dplyr)
temp2 <- group_by(mtcars, models)
temp3 <- summarise(temp2,
revisedmpg = xtra$newmpg[models==xtra$models] )
# error
dplyr
实现这种任务的优雅方法。期待看到这个问题的答案。你的问题真的很有趣,请尽力使其可重现,以便其他人可以帮助你。例如使用mtcars
数据集。 - dickoa