में समूह को अपने मूल क्रम (डेटा फ्रेम में पहली उपस्थिति के आधार पर क्रम में रखते हुए) को डेटा फ्रेम को एकत्रित करने में कुछ परेशानी हो रही है। मैंने इसे सही करने में कामयाब रहा है, लेकिन उम्मीद कर रहा था कि इसके बारे में जाने का एक आसान तरीका है।मूल क्रम रखते हुए कुल डेटा फ्रेम,
यहाँ पर काम करने के लिए सेट एक नमूना डेटा है:
set.seed(7)
sel.1 <- sample(1:5, 20, replace = TRUE) # selection vector 1
sel.2 <- sample(1:5, 20, replace = TRUE)
add.1 <- sample(81:100) # additional vector 1
add.2 <- sample(81:100)
orig.df <- data.frame(sel.1, sel.2, add.1, add.2)
कुछ बिंदुओं को नोट करने के लिए: यह तय करने के लिए कैसे डेटा एक साथ समूहीकृत है दो चयन स्तंभ हैं। वे वही होंगे, और उनके नाम ज्ञात हैं। मैंने केवल इस डेटा में दो अतिरिक्त कॉलम डाले हैं, लेकिन और भी कुछ हो सकता है। मैंने कॉलम नामों को 'सेल' और 'एड' से शुरू करना आसान बनाने के लिए दिया है, लेकिन वास्तविक डेटा के अलग-अलग नाम हैं (इसलिए grep
चालें शांत हैं, वे यहां उपयोगी नहीं होंगे)।
जो मैं करने की कोशिश कर रहा हूं वह 'सेल' कॉलम के आधार पर समूहों में डेटा फ्रेम को समेकित करता है, और सभी 'एड' कॉलम को एक साथ जोड़ता है। यह काफी सरल aggregate
का उपयोग कर इस प्रकार है:
# Get the names of all the additional columns
all.add <- names(orig.df)[!(names(orig.df)) %in% c("sel.1", "sel.2")]
aggr.df <- aggregate(orig.df[,all.add],
by=list(sel.1 = orig.df$sel.1, sel.2 = orig.df$sel.2), sum)
समस्या यह है कि परिणाम 'sel' कॉलम द्वारा आदेश दिया जाता है; मैं चाहता हूं कि यह मूल डेटा में प्रत्येक समूह की पहली उपस्थिति के आधार पर आदेश दिया जाए।
## Attempt 1
# create indices for each row (x) and find the minimum index for each range
index.df <- aggregate(x = 1:nrow(orig.df),
by=list(sel.1 = orig.df$sel.1, sel.2 = orig.df$sel.2), min)
# Make sure the x vector (indices) are in the right range for aggr.df
index.order <- (1:nrow(index.df))[order(index.df$x)]
aggr.df[index.order,]
## Attempt 2
# get the unique groups. These are in the right order.
unique.sel <- unique(orig.df[,c("sel.1", "sel.2")])
# use sapply to effectively loop over data and sum additional columns.
sums <- t(sapply(1:nrow(unique.sel), function (x) {
sapply(all.add, function (y) {
sum(aggr.df[which(aggr.df$sel.1 == unique.sel$sel.1[x] &
aggr.df$sel.2 == unique.sel$sel.2[x]), y])
})
}))
data.frame(unique.sel, sums)
इन मुझे सही परिणाम दे, वहीं मुझे उम्मीद थी कि किसी को एक सरल समाधान का कहना है हो सकता है:
यहाँ यह काम कर रही है पर मेरे सबसे अच्छे प्रयास कर रहे हैं। यह समाधान बेहतर होगा यदि समाधान मानक आर स्थापना के साथ आने वाले संकुल के साथ काम करता है।
मैं aggregate
और match
के लिए दस्तावेज़ को देखा है, लेकिन मैं एक जवाब (मुझे लगता है मैं aggregate
के लिए एक "keep.original.order" पैरामीटर की तरह कुछ के लिए उम्मीद कर रहा था) नहीं पा सके।
किसी भी मदद की बहुत सराहना की जाएगी!
अपडेट: (मामले में किसी को भी इस पार ठोकर)
यहाँ स्पष्ट तरीका है कि मैं कुछ और दिन के लिए प्रयास करने के बाद मिल सकता है है:
unique(data.frame(sapply(names(orig.df), function(x){
if(x %in% c("sel.1", "sel.2")) orig.df[,x] else
ave(orig.df[,x], orig.df$sel.1, orig.df$sel.2, FUN=sum)},
simplify=FALSE)))
अद्यतन के लिए धन्यवाद, यह शायद data.table का उपयोग करने का सबसे अच्छा समाधान कम है। कुल मिलाकर 'keep.original.order' पैरामीटर को लागू करने के लिए आर विकास टीम को कैसे बैजर करता है? यह एक स्पष्ट निरीक्षण की तरह लगता है .. –