दिए गए कॉलम को '_sales' के साथ सारांशित करके नया कॉलम कैसे बनाएं?

नीचे दिया गया कोड: md %>% rowwise()%>% mutate(sub_total=across(contains("_sales"),sum)) का परिणाम वह नहीं है जो मैं चाहता हूं। md$sub_total <- md$a_sales+md$b_sales+md$d_sales काम कर सकता है, लेकिन थोड़ा जटिल है जब दिए गए कॉलम वर्तमान से अधिक हैं

ori_data <- data.frame(a_sales=c(1:5),
                 tsalses=c(1:5),
                 b_sales=c(7:11),
                 d_sales=c(1:5))

# this can't work
md %>% rowwise()%>% mutate(sub_total=across(contains("_sales"),sum))

# this can work, but the code is little boring
md$sub_total <- md$a_sales+md$b_sales+md$d_sales
0
anderwyang 26 नवम्बर 2021, 13:12
धन्यवाद, लेकिन यह कोड वहां नए कॉलम "sub_total$a_sales, $b_sales, $d_sales" बनाता है, मैं उन्हें केवल एक कॉलम में मर्ज करना चाहता हूं। क्या आप इस पर मदद कर सकते हैं?
 – 
anderwyang
26 नवम्बर 2021, 13:18

2 जवाब

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

मुद्दा यह है कि आप किस तरह से उपयोग कर रहे हैं। अभी आप जो कह रहे हैं वह यह है कि "_sales" वाले प्रत्येक कॉलम के लिए आप एक योग करना चाहते हैं। आप वास्तव में इन स्तंभों को एक साथ जोड़ना चाहते हैं।

rowwise() और sum() का उपयोग करने के बजाय हम केवल rowSums() का उपयोग कर सकते हैं:

ori_data %>% 
  mutate(sub_total = rowSums(across(contains("_sales"))))
2
Wietse de Vries 26 नवम्बर 2021, 13:19
बिल्कुल सही, आपकी मदद के लिए धन्यवाद!
 – 
anderwyang
26 नवम्बर 2021, 13:28

@ Wietse का उत्तर आपको आपके वर्तमान प्रारूप में आपके डेटा के आधार पर एक समाधान देता है।

यह कहना भी सही है कि इस मामले में tidyverse फ़ंक्शन का उपयोग करना आसान नहीं होने का एक कारण यह है कि आपका डेटा फ़्रेम साफ-सफाई - क्योंकि आपके कॉलम नामों में वह जानकारी होती है जिसे आपको अपने सारांश में उपयोग करने की आवश्यकता होती है।

अपने डेटा को व्यवस्थित बनाने के लिए, आपको इसे लंबा करने के लिए अपने डेटा को पिवट करना होगा। तब tidyverse फ़ंक्शंस का उपयोग करना आसान हो जाता है। अपने डेटा को व्यवस्थित करने और एक ही चरण में अपने सब_टोटल की गणना करने के लिए यहां कुछ कोड दिए गए हैं।

md %>% 
  full_join(
    md %>% 
      pivot_longer(ends_with("_sales"), names_to="Variable", values_to="Value") %>% 
      group_by(tsalses) %>% 
      summarise(sub_total=sum(Value), .groups="drop"),
    by="tsalses"
  )
  a_sales tsalses b_sales d_sales sub_total
1       1       1       7       1         9
2       2       2       8       2        12
3       3       3       9       3        15
4       4       4      10       4        18
5       5       5      11       5        21

यदि यह समस्या किसी बड़े कार्यप्रवाह का हिस्सा है, तो शुरू करने से पहले अपने डेटा को व्यवस्थित करने में समय लगाना उचित हो सकता है। यदि आप ऐसा करते हैं, तो लंबे समय में आपका जीवन लगभग निश्चित रूप से आसान हो जाएगा।

0
Limey 26 नवम्बर 2021, 13:26
संक्षेप और पूर्ण रूप से शामिल होने के बजाय मैं म्यूटेट और स्प्रेड का उपयोग करने की सलाह दूंगा: mutate(sub_total=sum(Value)) %>% spread(Variable, Value)
 – 
Wietse de Vries
26 नवम्बर 2021, 13:38