मुझे STATA के साथ काम करने की अधिक आदत है और मैं R पर स्विच करने का प्रयास कर रहा हूं, और काम करने के लिए dplyr/सारांश का उपयोग करके इस एकत्रीकरण को प्राप्त करने में परेशानी हो रही है।

मेरे पास प्रवेश/निर्वहन चर के साथ एक डेटाफ्रेम है, और बाइनरी (0,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     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

जहां प्रत्येक पंक्ति अनिवार्य रूप से संकेतकों की एक श्रृंखला है कि उस दिन एक मरीज को कौन सी दवाएं मिलीं।

चरण 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

ताकि अब प्रति दिन एक पंक्ति हो (जबकि डुप्लीकेट ड्रगडेट्स मौजूद थे जब एक निश्चित दिन में एक से अधिक दवाएं दी जाती थीं)।

चरण 2

मैं तब एक नया डेटासेट बनाना चाहूंगा जो "ड्रग डे" की गणना करता है अर्थात।

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

चरण 2 मैंने सोचा कि कैसे करना है, लेकिन मैंने सोचा कि शायद समुदाय के पास गणना करने के सबसे तेज़ तरीके के बारे में राय होगी क्योंकि डेटासेट काफी बड़ा है। मेरी समझ dplyr आमतौर पर कम्प्यूटेशनल रूप से कुशल है।

मैं बस कुछ ऐसा नहीं करना पसंद करूंगा:

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

क्योंकि कई चर हैं।

मेरे लिए वर्नामों की सूची को परिभाषित करना आदर्श होगा, फिर प्रक्रिया को स्वचालित करने के लिए आवेदन/फॉर-लूप का उपयोग करें।

0
KevinM 1 मार्च 2017, 21:50
अपने डेटा को देखते हुए, ऐसा लगता है कि आप अलग-अलग श्रेणियों की गणना करना चाहते हैं और संख्याओं को जोड़ना चाहते हैं। मैं f <- function(x) if(is.factor(x)) return(n_distinct(x)) else return(sum(x)) जैसे फ़ंक्शन बनाउंगा और फिर बस df %>% group_by(ID, AdmitDate, DCdate) %>% summarise_each(funs(f)) चलाएं जो आपको जो चाहिए उसे प्राप्त करने के लिए प्रतीत होता है।
 – 
David Arenburg
1 मार्च 2017, 22:02
मुझे लगता है कि यह मुझे चरण 2 के लिए कॉलम 5 देता है? अब तक चरण 1 के लिए, मेरे पास df2 <- df %>% group_by(id, DrugDate) %>% summarise_at(vars(n:N), max) है, जहां कॉलम n:N ड्रगबी चर के माध्यम से मेरे ड्रगए हैं।
 – 
KevinM
1 मार्च 2017, 22:23

1 उत्तर

सबसे बढ़िया उत्तर

आप reshape2 जैसे पैकेज या एक साफ-सुथरे पैकेज का उपयोग करके विभिन्न दवाओं को एक कॉलम में बदल सकते हैं या 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
Lloyd Christmas 1 मार्च 2017, 23:05
मैं देखता हूं, और फिर मूल स्वरूप में वापस आने के लिए व्यापक रूप से दोबारा आकार देता हूं?
 – 
KevinM
1 मार्च 2017, 22:51
हां, आप cast डेटा को विस्तृत प्रारूप में वापस ला सकते हैं, हालांकि आपको इसकी आवश्यकता है। मैंने एक उदाहरण शामिल करने के लिए उत्तर संपादित किया। यहाँ एक अच्छा डेमो है: seananderson.ca/2013/10/19/reshape.html
 – 
Lloyd Christmas
1 मार्च 2017, 23:05