मान लें कि मेरे पास टूथ ब्रश ब्रांडों का एक डेटा फ्रेम है और यह मापता है कि वे समय के साथ कितने लोकप्रिय हैं:

year  brand_1  brand_2
2010  0.7      0.3
2011  0.6      0.6
2012  0.4      0.9

और दूसरा जो कहता है कि जब प्रत्येक टूथ ब्रश ब्रांड NA के साथ इलेक्ट्रिकल हो गया, जिसका अर्थ है कि उन्होंने ऐसा कभी नहीं किया:

brand    went_electrical_year
brand_1  NA
brand_2  2011

अब मैं हर साल इलेक्ट्रिक टूथ ब्रश ब्रांड (कुल के अनुपात के रूप में) की व्यापकता प्राप्त करने के लिए इन्हें जोड़ना चाहता हूं:

year  electrical_prevalence
2010  0
2011  0.5
2012  0.69

2010 में यह 0 बी/सी है, कोई भी ब्रांड इलेक्ट्रिकल नहीं है। 2011 में यह 0.5 बी/सी दोनों हैं और वे समान रूप से प्रचलित हैं। २०१२ में यह ०.६९ b/c दोनों हैं, लेकिन विद्युत एक अधिक प्रचलित है।

मैंने इसके साथ आर में कुश्ती की है लेकिन इसे करने का कोई तरीका नहीं समझ सकता। किसी भी मदद या सुझाव की सराहना करेंगे। चीयर्स।

r
1
erwald 10 अक्टूबर 2020, 20:43

1 उत्तर

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

मान लें कि आपके डेटा फ़्रेम df1 और df2 हैं, तो आप निम्न tidyverse दृष्टिकोण का उपयोग कर सकते हैं।

सबसे पहले, अपने डेटा को लंबे प्रारूप में रखने के लिए pivot_longer का उपयोग करें, जिसमें हेरफेर करना आसान होगा। left_join का उपयोग उन प्रासंगिक वर्षों को जोड़ने के लिए करें जब ब्रांड विद्युतीकृत हो गए थे।

हम एक संकेतक mult बना सकते हैं जो 1 होगा यदि ब्रांड बिजली चला गया है, या शून्य अगर यह नहीं है।

फिर, प्रत्येक वर्ष के लिए, आप प्रत्येक ब्रांड के लिए लोकप्रियता मान को mult से गुणा करके और फिर उस वर्ष के लिए कुल योग से विभाजित करके अनुपात निर्धारित कर सकते हैं।

library(tidyverse)

df1 %>%
  pivot_longer(cols = -year) %>%
  left_join(df2, by = c("name" = "brand")) %>%
  mutate(mult = ifelse(went_electrical_year > year | is.na(went_electrical_year), 0, 1)) %>%
  group_by(year) %>%
  summarise(electrical_prevalence = sum(value * mult) / sum(value))

आउटपुट

   year electrical_prevalence
  <int>                 <dbl>
1  2010                 0    
2  2011                 0.5  
3  2012                 0.692
2
Ben 10 अक्टूबर 2020, 21:04