我正在处理索赔数据,其格式如下: -
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)))
它给了我错误。我想知道我的错误以及如何解决它。
答案 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_number
和year_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")]
但功能请求仍然是开放的。