【问题标题】:Pulling data from a different data.frame with dplyr?使用 dplyr 从不同的 data.frame 中提取数据?
【发布时间】:2014-02-09 03:59:40
【问题描述】:

我有一个名为 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 上加载包,以尝试消除任何命名空间问题。

谢谢

编辑 - 可重现的示例

这是一个快速而肮脏的示例,只是为了说明问题。如果我们创建一个“查找”data.frame,每辆车有 2 个,mpg 约为 500,然后我们可以尝试遍历原始 data.frame,在新的 data.frame 中查找并将两个 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

【问题讨论】:

  • 两周前我遇到了类似的问题,我认为这与github.com/hadley/dplyr/issues/170 有关。我确实希望有一种优雅的方式来使用dplyr 来完成这种任务。期待看到这个问题的答案。你的问题真的很有趣,所以如果你帮助你,请努力使它可复制。以mtcars 数据集为例。
  • 好的,虽然很粗糙:)
  • 谢谢。希望dplyr 大师现在能找到解决方法。
  • 我认为你想要的是交叉连接,如stackoverflow.com/questions/19552104,dplyr 目前不支持。这是第三次出现这个问题,所以我会在以后的版本中考虑这个问题,github.com/hadley/dplyr/issues/197
  • 也许是@hadley。这可能是一个糟糕的单词选择,但我更愿意将这个(我当前的工作 plyr 版本)视为一种查找,而不是任何形式的连接。正如我在下面对特洛伊回答的评论中所回避的那样,我不喜欢“加入”的想法,因为您在结果数据框/表中获得了 n1 x n2 条记录(然后对其进行操作)。

标签: r plyr data-manipulation dplyr


【解决方案1】:

怎么样:

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

编辑对不起,我认为这是你想要的;

# 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",..)) 调用

【讨论】:

  • 或者你可以使用dplyr::inner_join() ;)
  • 谢谢特洛伊。所以这可以完成工作,并且比我的数据集上的 plyr 更快(我在 dat_new 中有大约 15k 条记录,在 event 中有 900 条记录)。不过,我不太热衷于将两者合并作为第一步。一个主题有 25 条记录,另一条有 15 条记录,最终在合并数据集中有 375 条记录。因此,虽然它仍然更快,但它有一种真正违反直觉/草率的感觉。明明没有冒犯!这可能是我们目前最好的!此外,输出也不相同,plyr 的输出与 dat_new 具有相同的行数,此解决方案丢弃所有 (dka2/3/8) 为 0 的行。
  • V 粗略测试在我的数据上运行此解决方案的 inner_join 运行速度比合并快约 3 倍 @hadley
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-22
  • 2015-06-26
  • 2016-07-03
  • 2014-12-15
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
相关资源
最近更新 更多