सवाल अद्वितीय पहचानकर्ता द्वारा एकत्रित और एक स्ट्रिंग में संबंधित मानों को जोड़ना [डुप्लिकेट]


इस प्रश्न का उत्तर यहां दिया गया है:

मुझे एक ज़रूरत है कि मैं कल्पना कर सकता हूं कि इससे संतुष्ट हो सकता है aggregate या reshape, लेकिन मैं काफी समझ नहीं सकता।

मेरे पास नामों की एक सूची है (brand), और आईडी संख्या के साथ (id)। यह डेटा लंबे रूप में है, इसलिए नामों में एकाधिक आईडी हो सकती है। मैं नाम से डी-डुप्लिकेट करना चाहता हूं (brand) और कई संभव संगत idएक टिप्पणी से अलग एक स्ट्रिंग में है।

उदाहरण के लिए:

brand            id 
RadioShack       2308
Rag & Bone       4466
Ragu             1830
Ragu             4518
Ralph Lauren     1638
Ralph Lauren     2719
Ralph Lauren     2720
Ralph Lauren     2721
Ralph Lauren     2722 

बन जाना चाहिए:

RadioShack       2308
Rag & Bone       4466
Ragu             1830,4518
Ralph Lauren     1638,2719,2720,2721,2722

मैं इसे कैसे पूरा करूं?


44
2018-05-16 20:08


मूल


आपके वांछित आउटपुट में, "रागु" दो बार नहीं दिखना चाहिए, है ना? - Frank
प्रत्येक ब्रांड के लिए, क्या आप परिणाम एक होना चाहते हैं list आईडी के, या एक स्ट्रिंग एक साथ pated? - Ricardo Saporta


जवाब:


आइए अपना डेटा कॉल करें। फ्रेम DF

> aggregate(id ~ brand, data = DF, c)
         brand                           id
1   RadioShack                         2308
2   Rag & Bone                         4466
3         Ragu                   1830, 4518
4 Ralph Lauren 1638, 2719, 2720, 2721, 2722

एक और विकल्प का उपयोग कर aggregate है:

result <- aggregate(id ~ brand, data = DF, paste, collapse = ",")

यह एक ही परिणाम और अब पैदा करता है id नहीं है कोई list अब और। @ फ्रैंक टिप्पणी के लिए धन्यवाद। देखने के लिए class प्रत्येक कॉलम का प्रयास करें:

> sapply(result, class)
      brand          id 
   "factor" "character"

टिप्पणियों में @ डेविड एडनबर्ग द्वारा वर्णित अनुसार, एक और विकल्प इसका उपयोग कर रहा है toString समारोह:

aggregate(id ~ brand, data = DF, toString)

52
2018-05-16 20:12



बहुत अजीब बात यह है कि आर मुझे इस डेटा को आउटपुट नहीं दे रहा है। फ्रेम ... मुझे लगता है क्योंकि id एक सूची है मैं एक सीएसवी में कैसे निर्यात करूं? - roody
@Jilber आपके "आईडी" आउटपुट कॉलम की कक्षा "चरित्र" (सूची नहीं) होनी चाहिए, मुझे लगता है, क्योंकि ओपी डेटा फ्रेम निर्यात करना चाहता है। - Frank
+1। मुझे इस समाधान को पसंद है जैसा कि मेरे अपने उपयोग के लिए है। मुझे लगता है कि आप इसे बदलना चाहेंगे aggregate(id~brand,paste,collapse=",",data=df) या ओपी के सवाल के लिए समान है, यद्यपि। - Frank
उल्लेख के लायक aggregate(id ~ brand, DF, toString) शायद भी - David Arenburg
क्या होगा यदि मैं वही करना चाहता हूं लेकिन केवल विशिष्ट मूल्य के लिए? मेरा मतलब है, केवल आपके उदाहरण में id==2308। - Henry Navarro


एक अच्छी साफ एक लाइन में data.table

library(data.table)
setDT(DF)

दो विकल्प:

एक सूची के रूप में परिणाम

DF[ , .(id = list(id)), by = brand]
          brand                       id
1:   RadioShack                     2308
2:   Rag & Bone                     4466
3:         Ragu                1830,4518
4: Ralph Lauren 1638,2719,2720,2721,2722
> 

एक स्ट्रिंग के रूप में परिणाम

DF[ , .(id = paste(id, collapse=",")), by = brand]
          brand                       id
1:   RadioShack                     2308
2:   Rag & Bone                     4466
3:         Ragu                1830,4518
4: Ralph Lauren 1638,2719,2720,2721,2722

ध्यान दें

हालांकि दो परिणाम दिखाई वही (वह तब होता है जब आप उन्हें प्रिंट करते हैं, वे समान दिखते हैं), वे वास्तव में बहुत अलग हैं और विभिन्न कार्यक्षमता की अनुमति देते हैं।

अर्थात्, सूची विकल्प का उपयोग करके (पहला वाला) आपको ऑरगनल पर फ़ंक्शंस करने की अनुमति देता है idरों।

उत्तरार्द्ध आपको जानकारी को अधिक आसानी से प्रदर्शित करने की अनुमति देगा (इसमें निर्यात सहित CSV या excel), लेकिन पर काम करने के लिए idउन्हें वापस splicing की आवश्यकता होगी।


33
2018-05-16 21:09



धन्यवाद! सूची (सूची (आईडी)) काम करता है, लेकिन क्यों? - LauriK
@LauriK, list(list(id)) उत्तर में पहला विकल्प जैसा ही है। सूची में नाम का एकमात्र अंतर स्पष्ट रूप से दिया गया है या नहीं। बाहरी list, data.table अर्थ "कॉलम" में अनुवाद करेगा (क्योंकि सभी डेटाटेबल्स और डेटा.फ्रेम वास्तव में कॉलम की एक सूची हैं)। भीतरी list इंगित करता है कि प्रत्येक सेल में मान एक सूची होगी - Ricardo Saporta


या प्रयोग कर रहे हैं dplyr:

library(dplyr)
DF %>%
  group_by(brand) %>%
  summarise(id = paste(id, collapse = ","))

कहा पे DF आपके डेटा का नाम है। फ्रेम।


17
2018-05-22 12:39



यह संक्षेप में कॉलम को अल्पविराम से अलग स्ट्रिंग प्रकार बना देगा .. वेक्टर नहीं ... - sriharsha KB
नहीं, जैसा कि दूसरे उत्तरों में परिणाम एक डेटा है। फ्रेम, एक वेक्टर के साथ कहा जाता है id कक्षा का character के तार शामिल हैं idप्रश्न में वांछित के रूप में अल्पविराम से अलग। is.vector(DF$id) रिटर्न TRUE। यदि आपके पास इस दृष्टिकोण के बारे में कोई सवाल है, तो इसे एक नए प्रश्न के रूप में पोस्ट करने पर विचार करें। - Sam Firke
लाइब्रेरी (dplyr) डीएफन्यू <-DF%>% group_by (ब्रांड)%>% संक्षेप (आईडी = अद्वितीय (सूची (आईडी))) यह मेरे लिए काम करता है - sriharsha KB


बेस आर में जानकारी यहां दी गई है:

myby <- by(df$id,df$brand,function(x)paste(x,collapse=","))

"द्वारा" ऑब्जेक्ट्स का स्वरूपण अजीब है। आप ले सकते हैं data.frame(id=c(myby)) और ब्रांड rownames बन जाएगा:

#                                    id
# RadioShack                       2308
# Rag & Bone                       4466
# Ragu                        1830,4518
# Ralph Lauren 1638,2719,2720,2721,2722

वैकल्पिक रूप से, अगर आप लोड करते हैं data.table पैकेज, यह काम करेगा:

dt <- data.table(df)
dt[,paste(id,collapse=","),by=brand]
#           brand                       V1
# 1:   RadioShack                     2308
# 2:   Rag & Bone                     4466
# 3:         Ragu                1830,4518
# 4: Ralph Lauren 1638,2719,2720,2721,2722

9
2018-05-16 20:17