首页 文章

使用dplyr从不同的data.frame中提取数据?

提问于
浏览
5

我有一个名为dat_new的数据框,基本上是诊所访问数据,hrn是患者ID,而dov是访问日期(每人多次访问) . 然后我有一个名为事件的数据框,其中有过期的住院(每人多次入院) .

我想做的是,对于每次门诊就诊,我想总结在门诊就诊之前发生的住院,简单 .

这适用于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上加载包来尝试消除任何命名空间问题 .

谢谢

编辑 - 可重复的例子

这是一个快速而肮脏的例子,仅用于说明问题 . 如果我们制作一个'查询'data.frame,其中每辆车有2个,mpg大约为500,那么我们可以尝试通过原始data.frame,查找新的data.frame并将两个mpgs加在一起 . 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

1 回答

  • 2

    怎么样:

    merge(mtcars,xtra,by="models") %.% group_by(models) %.% summarise(sum(newmpg))
    

    EDIT 抱歉,我认为这就是你想要的;

    # from what I can tell of your data:
    dat_new<-data.frame(hrn=c("P1","P2"),dov=42000)
    event<-data.frame(hrn=sample(dat_new$hrn,20,T),doa=41990+sample(1:20,20),event_code=sample(2:8,20,T))
    
    
    merge(dat_new,event,by="hrn") %.%
    filter(doa<=dov) %.% 
    group_by(hrn,dov) %.%
    summarise(dka2=length(event_code[event_code==2]),
              dka3=length(event_code[event_code==3]),
              dka8=length(event_code[event_code==8]))
    
    Source: local data frame [2 x 5]
    Groups: hrn
    
      hrn   dov dka2 dka3 dka8
    1  P1 42000    2    1    0
    2  P2 42000    1    0    1
    

    道歉 - 我在编辑之前混淆了doa和dov - 您可能需要根据表中的其他内容调整 merge(,by=c("x",..)) 调用

相关问题