2017-03-01 118 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 –