r:通过dplyr的group_by函数传递列列表

时间:2018-09-29 17:30:49

标签: r dplyr

第一篇文章,相对于R从SAS / SQL而言相对较新。我有一张医疗账单代码列表,我的数据是``长''格式的,在那里我得到一行数据,其中包括客户标识符,日期和一个CPT代码,以及单位数量和总费用

比方说,我的数据包含患者标识符(PTID),程序标识符(ProgramID),服务日期变量(DateService),CPT代码(ServiceCode)和收费单位数(ServiceUnits)。让我们暂时忽略成本变量。

对于给定的患者和就诊机会,我想看看正在提交给我们的代码中的“模式”。例如,如果他们向我们收取某种特定类型的测试费用,他们是否也倾向于向我们收取某种类型的标本收集费用?

因此,我首先使用dplyr和'dcast'将数据从'long'转换为'wide':

claims3 <- dcast(claims2, 
   PTID + ProgramID + DateService ~ paste('Count', ServiceCode, sep =''), 
   value.var = 'ServiceUnits', 
   fun.aggregate = sum)

然后,我想获取每个“行模式”出现在数据集中的次数(减去标识符)。如果您熟悉SAS,那么我想要类似PROWAY FREQ的输出,并在多向表上使用LIST选项。我发现了几种不同的方法可以做到这一点,例如:

claims4 <- select(claims3, -PTID, -DateService, -ProgramID)
c <- claims4 %>% group_by(CountXXXXX, CountYYYYY, CountZZZZZ) %>% tally()

但是,我试图弄清楚如何使用更好的编码来防止自己单独列出group_by子句中的所有列。在上面的示例中,我给出了3种不同的CPT代码。实际上,有50多个。这是我的最佳尝试,一次通过group_by传递了一个列名列表。失败:

claims4 <- select(claims3, -PTID, -DateService, -ProgramID)
varnames <-list(colnames(claims4))
c2 <- claims4 %>% group_by(varnames) %>% tally()

任何建议将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:2)

我无权访问您的数据,但这对mtcars数据来说对我有用。在您的代码中,只需使用colnames(claims4)来将varnames保留为字符向量,而不是列表。这个想法是将您的字符向量转换为syms的符号向量,然后用!!!取消对符号向量的引用:

library(tidyverse)
varnames <- c("cyl", "am")
mtcars %>% group_by(!!!syms(varnames)) %>% tally()