R - 如何在dplyr中集成?

时间:2015-10-15 19:33:22

标签: r medical data-cleaning

我正在处理索赔数据,其格式如下: -

claim  mem_number  year_month  label
 1      123         2011-Jan   Clinic
 2      123         2011-Jan   Lab
 3      123         2011-Jan   Office
 4      234         2011-Jan   office
 5      234         2012-Feb   Lab

我想通过mem_number和year_month进行分组,并将所有这些标签转交给诊所,即使该组中的单个标签是诊所。输出应该是: -

Claim  mem_number  year_month  label
 1      123         2011-Jan   Clinic
 2      123         2011-Jan   Clinic
 3      123         2011-Jan   Clinic
 4      234         2011-Jan   Office
 5      234         2012-Feb   Lab

我解决这个问题的方法是: -

library("dplyr")

output<-input %>% group_by(mem_number,year_month) %>%
        mutate(label=if(any(label=="Clinic","Clinic",NA)))

它给了我错误。我想知道我的错误以及如何解决它。

2 个答案:

答案 0 :(得分:3)

使用data.table,我会这样做:

require(data.table) # v1.9.6+
dt[dt[label == "Clinic"], label := "Clinic", on="mem_number"]

我们提取label == "Clinic"的行。这允许我们使用与这些行对应的mem_number。我们会在dt上对这些行执行联接,对于每个匹配的行,我们会使用值label更新"Clinic"

正如@Frank指出的那样,如果您希望将联接改为mem_numberyear_month,请使用on=c("mem_number", "year_month")。我不认为你所展示的例子是必要的。

答案 1 :(得分:2)

我会使用data.table:

library(data.table)
setDT(DT)

bad_rows <- DT[, 
  if (any(label=="Clinic")) .I[label != "Clinic"]
, by=.(mem_number,year_month)]$V1

DT[ bad_rows, label := "Clinic" ]

bad_groups <- DT[, 
  if (any(label=="Clinic")) 1
, by=.(mem_number,year_month)][, V1 := NULL]

DT[ bad_groups, label := "Clinic", on=c("mem_number", "year_month")]

评论。我认为如果我们可以写

会更清楚
# pseudocode -- DOES NOT WORK
DT[, 
  label[label != "Clinic"] := "Clinic"
, by=.(mem_number, year_month), having = any(label=="Clinic")]

但功能请求仍然是开放的。