r - अपन - मूल्य के महत्व



R: डेटा फ्रेम बी में एक पंक्ति को पॉप्युलेट करने से पहले डेटा फ्रेम ए से मूल्यों का उपयोग करना (2)

ठीक है हर किसी की मदद के लिए धन्यवाद यह मुझे बहुत अधिक परिश्रम, रक्त, पसीना और आँसू लेकर आया था, लेकिन यह मैं जिस समाधान के साथ आया हूं:

  1. डेटा फ्रेम दोनों मर्ज करें:

df_AB <- मर्ज (df_A, df_B, all.x = T)

df_AB:

  MRN Transfusion.Date  Test.Date   Test.Result
1   1       2000-01-01 1999-11-30      negative
2   1       2000-01-01 2000-01-15 700 copies/ul
3   1       2000-01-01 2000-01-27 900 copies/ul
4   1       2000-01-30 1999-11-30      negative
5   1       2000-01-30 2000-01-15 700 copies/ul
6   1       2000-01-30 2000-01-27 900 copies/ul
7   2       2003-04-01 2003-03-30      negative
8   3       2003-04-01       <NA>          <NA>

dplyr का उपयोग करना

df_tests <- df_AB %>% 
  group_by(MRN, Transfusion.Date) %>%
  mutate(Time.Difference = Transfusion.Date - Test.Date) %>%
  filter(Time.Difference > 0) %>%
  arrange(Time.Difference) %>%
  summarize(Test.Date = Test.Date[1], Test.Result = Test.Result[1])

df_tests:

  MRN Transfusion.Date  Test.Date Test.Result
1   1       2000-01-01 1999-11-30    negative
2   1       2000-01-30 1999-11-30    negative
3   2       2003-04-01 2003-03-30    negative

using merge again for MRN3:

df_desired <- merge(df_A, df_tests, all.x = T)

  MRN Transfusion.Date  Test.Date   Test.Result
1   1       2000-01-01 1999-11-30      negative
2   1       2000-01-30 2000-01-27 900 copies/ul
3   2       2003-04-01 2003-03-30      negative
4   3       2003-04-01       <NA>          <NA>

यह बहुत जटिल हो सकता है और मुझे संदेह है कि उन्नत ज्ञान की आवश्यकता है। मेरे पास अब दो अलग-अलग प्रकार के डेटा। फ्रेम हैं जिन्हें मुझे गठबंधन करना होगा:

आँकड़े:

डाटाफ्रेम ए:

रोगी आईडी से सभी आधान की तारीखों को सूचीबद्ध करता है प्रत्येक आधान का एक अलग पंक्ति द्वारा प्रतिनिधित्व किया जाता है, मरीजों में कई संक्रमण हो सकते हैं अलग-अलग रोगियों को उसी तिथि पर संक्रमण हो सकता है

Patient ID Transfusion.Date
1          01/01/2000
1          01/30/2000
2          04/01/2003
3          04/01/2003

टाइप बी के डेटाफ्रेम में अन्य तिथियों में परीक्षण के परिणाम होते हैं, रोगी द्वारा भी आईडी:

Patient ID  Test.Date   Test.Value
1           11/30/1999   negative
1           01/15/2000   700 copies/uL
1           01/27/2000   900 copies/uL
2           03/30/2003   negative

मैं क्या चाहता हूं कि डेटाफ्रेम ए को समान पंक्तियों के साथ (प्रत्येक आधान के लिए 1), और सबसे हालिया टेस्ट के साथ। एक अलग कॉलम के रूप में मूल्य। प्रत्येक रक्ताधान की तारीख में परीक्षण से परिणाम होना चाहिए जो रक्तसंक्रमण के लिए सबसे पहले (पूर्व) किया गया था।

वांछित उत्पादन:

->

Patient ID Transfusion.Date Pre.Transfusion.Test
1          01/01/2000       negative
1          01/30/2000       900 copies/ul
2          04/01/2003       negative
3          04/01/2003       NA

मुझे लगता है कि सामान्य रणनीति मरीज आईडी द्वारा डेटा.फ्रेम को सबसे कम करना होगा। फिर रोगी 1 के लिए सभी रक्तस्राव की तारीखें लें, जांचें कि प्रत्येक तत्व के लिए सभी उपलब्ध परीक्षण_डेट्स के नतीजे सबसे नजदीक हैं और फिर मूल्य निकटतम लौटाएं।

मैं ऐसा करने के लिए R कैसे समझा सकता हूं?

1 संपादित करें : इन उदाहरणों के लिए आर-कोड है

df_A <- data.frame(MRN = c(1,1,2,3), 
                   Transfusion.Date = as.Date(c('01/01/2000', '01/30/2000', 
                   '04/01/2003','04/01/2003'),'%m/%d/%Y')) 

df_B <- data.frame(MRN = c(1,1,1,2), 
                   Test.Date = as.Date(c('11/30/1999', '01/15/2000', '01/27/2000', 
                   '03/30/2003'),'%m/%d/%Y'), Test.Result = c('negative', 
                   '700 copies/ul','900 copies/ul','negative'))

2 संपादित करें:

स्पष्ट करने के लिए, परिणामस्वरूप डेटा होना चाहिए: रोगी एक दिवस एक्स और डे वाई पर प्राप्त ट्रांसफ्यूशन। (डीएफ_ए के लिए) दिन एक्स पर रक्तसंक्रमण से पहले, उनका सबसे हालिया परीक्षण परिणाम एक्स (डीएफबीआई में पहले रक्तचाप के लिए सबसे निकटतम परीक्षण तिथि) था। दिन वाई पर आधान से पहले, उनका सबसे हालिया परीक्षण परिणाम वाई था (दूसरा रक्तस्राव से पहले, df_B में भी। Df_B में अन्य परीक्षण तिथियों का एक गुच्छा भी होता है, जो अंतिम आउटपुट के लिए आवश्यक नहीं है।


Answer #1

यहां data.table के योग्य रोलिंग शामिल हो रहा है:

require(data.table)
setkey(setDT(df_A), MRN, Transfusion.Date)
setkey(setDT(df_B), MRN, Test.Date)

df_B[df_A, roll=TRUE]
#    MRN  Test.Date   Test.Result
# 1:   1 2000-01-01      negative
# 2:   1 2000-01-30 900 copies/ul
# 3:   2 2003-04-01      negative
# 4:   3 2003-04-01            NA
  • setDT data.frame को data.table द्वारा संदर्भित करता है (किसी भी अतिरिक्त प्रतिलिपि के बिना)। इसका परिणाम df_A और df_B अब डेटा।

  • setkey data.table द्वारा प्रदान किए गए कॉलम द्वारा data.table को data.table प्रदान करता है, और उन कॉलम को कुंजी कॉलम के रूप में चिह्नित करता है , जो हमें द्विआधारी खोज के आधार पर जुड़ने की अनुमति देता है।

  • हम कुंजी कॉलम पर प्रपत्र x[i] शामिल होने के लिए करते हैं, जहां i की प्रत्येक पंक्ति के लिए, i पंक्तियों के साथ x (यदि कोई हो, अन्य) की मेल की गई पंक्तियां लौटा दी जाती हैं यही वह है जिसे हम एक समान-जुड़ने में शामिल करते हैंroll = TRUE जोड़कर roll = TRUE , एक बेमेल की स्थिति में, अंतिम अवलोकन अग्रेषित किया जाता है (LOCF)। यही वह है जिसे हम एक रोलिंग जॉइनिंग कहते हैं । बढ़ते क्रम में क्रमबद्ध ( setkey() कारण) यह सुनिश्चित करता है कि अंतिम अवलोकन सबसे हाल की तिथि है।

HTH





dataframe