2017-03-01 97 views
0

我更习惯于使用STATA并尝试切换到R,并且无法使用dplyr/summarize工作来获取此聚合。在R中按日期汇总变量

我有一个数据帧与入场/放电变量,和一系列的二进制(0,1)结果表明药物收到'DrugDate'。

# ID AdmitDate DCdate  DrugDate DrugA DrugB .. DrugZ 
# 1 03/01/2017 03/04/2017 03/01/2017 1  0  0 
# 1 03/01/2017 03/04/2017 03/02/2017 1  0  0 
# 1 03/01/2017 03/04/2017 03/02/2017 0  1  0 
# 1 03/01/2017 03/04/2017 03/03/2017 1  0  0 
# 1 03/01/2017 03/04/2017 03/04/2017 1  0  0 

其中每行基本上是一系列病人当天收到的药物的指标。

STEP 1. 我想先巩固数据集,像这样:

# ID AdmitDate DCdate  DrugDate DrugA DrugB .. DrugZ 
# 1 03/01/2017 03/04/2017 03/01/2017 1  0  0 
# 1 03/01/2017 03/04/2017 03/02/2017 1  1  0 
# 1 03/01/2017 03/04/2017 03/03/2017 1  0  0 
# 1 03/01/2017 03/04/2017 03/04/2017 1  0  0 

所以,现在在每天有一列(而在此之前重复DrugDates存在了,当在某个给定的一种药多名天)。

STEP 2

话,我想创建一个新的数据集计数“药物天”,即

# ID AdmitDate DCdate  TotDays DrugDaysA DrugDaysB .. DrugZ 
# 1 03/01/2017 03/04/2017 4  4   1   0 

第二步我想通了,该怎么做,但我想也许是社会必须关于作为数据集来计算的最快方式的意见非常大。我的理解是dplyr通常在计算上是高效的。

我宁愿不只是像做:

DF %>% group_by(id, drugdate) %>% summarise(NewVar = max(DrugA)) 

由于存在很多变数。

对我来说,定义一个varname列表非常理想,然后使用apply/for-loop来自动执行该过程。

+0

看着你的数据,它似乎你想计算不同的类别和数字的总和。如果(is.factor(x))return(n_distinct(x))else return(sum(x))',我会创建一个函数,如'f < - function(x)',然后简单地运行'df%>%group_by (ID,AdmitDate,DCdate)%>%summarise_each(funs(f))'这似乎达到你所需要的。 –

+0

我认为这给了我第5步第2步?到目前为止,对于第1步,我有'df2 <- df %>%group_by(id,DrugDate)%>%summarise_at(vars(n:N),max)',其中列n:N是我的DrugA通过DrugB变量。 – KevinM

回答

0

您可以使用像reshape2或tidyverse软件包这样的软件包将不同的药物重塑或使用melt

然后调用dplyr并不重要你有多少变量(毒品)。我提供了一个应该说明问题的简单示例。您可以根据需要进行扩展。

library(dplyr) 
library(reshape2) 

# set up for data 
set.seed(5) 
n <- 9 

#create data frame 
df <- data.frame(id = as.factor(rep(1:3, n/3)), 
       date = as.character(sample(size=n, 1:10)), 
       drugA = sample(size=n, 1:2, replace=TRUE), 
       drugB = sample(size=n, 1:2, replace=TRUE)) 

#melt data 
dfm <- melt(df, id.vars=c("id", "date")) 

#call to dplyr 
dfms <- dfm %>% group_by(id, date, variable) %>% summarise(max = max(value)) 

> head(dfms) 
Source: local data frame [6 x 4] 
Groups: id, date [3] 

     id date variable max 
    <fctr> <fctr> <fctr> <int> 
1  1  6 drugA  1 
2  1  6 drugB  2 
3  1  7 drugA  2 
4  1  7 drugB  2 
5  1  9 drugA  2 
6  1  9 drugB  1 

要恢复到宽格式,您可以使用cast函数。

> head(dcast(dfms, id + date ~ variable, value.var = "max")) 
    id date drugA drugB 
1 1 6  1  2 
2 1 7  2  2 
3 1 9  2  1 
4 2 10  1  2 
5 2 2  2  1 
6 2 8  1  1 
+0

我看到了,然后重新整形以恢复原始格式? – KevinM

+0

是的,无论你需要什么,你都可以将数据转换回大格式。我编辑了答案来包含一个例子。这里有一个很好的演示:http://seananderson.ca/2013/10/19/reshape.html –