यह plyr
मेलिंग सूची एक पर आया समय पहले (कम नहीं @kohske द्वारा उठाए गए) और यह एक समाधान सीमित मामलों के लिए पीटर Meilstrup द्वारा की पेशकश की है:
#Peter's version used a function gensym to
# create the col name, but I couldn't track down
# what package it was in.
keeping.order <- function(data, fn, ...) {
col <- ".sortColumn"
data[,col] <- 1:nrow(data)
out <- fn(data, ...)
if (!col %in% colnames(out)) stop("Ordering column not preserved by function")
out <- out[order(out[,col]),]
out[,col] <- NULL
out
}
#Some sample data
d <- structure(list(g = c(2L, 2L, 1L, 1L, 2L, 2L), v = c(-1.90127112738315,
-1.20862680183042, -1.13913266070505, 0.14899803094742, -0.69427656843677,
0.872558638137971)), .Names = c("g", "v"), row.names = c(NA,
-6L), class = "data.frame")
#This one resorts
ddply(d, .(g), mutate, v=scale(v)) #does not preserve order of d
#This one does not
keeping.order(d, ddply, .(g), mutate, v=scale(v)) #preserves order of d
कृपया हैडली के लिए thread पढ़ा करते हैं इस कार्यक्षमता को ddply
में रोल करने के लिए पर्याप्त सामान्य क्यों नहीं हो सकता है, विशेष रूप से यह संभवतः आपके मामले में लागू होता है क्योंकि आप प्रत्येक टुकड़े के साथ कम पंक्तियों को वापस करने की संभावना रखते हैं।
संपादित अधिक सामान्य मामलों
ddply
कुछ है कि एक आदेश आप पसंद नहीं करते में क्रमबद्ध हो जाता outputting है तो के लिए एक रणनीति शामिल करने के लिए आप मूल रूप से दो विकल्प हैं: बंटवारे चर पर वांछित आदेश निर्दिष्ट पहले से उपयोग करते हुए आदेश दिया गया कारक, या तथ्य के बाद आउटपुट मैन्युअल रूप से सॉर्ट करें। , तार का उपयोग कर अब के लिए
d <- data.frame(x1 = rep(letters[1:3],each = 5),
x2 = rep(letters[4:6],5),
x3 = 1:15,stringsAsFactors = FALSE)
:
उदाहरण के लिए, निम्न डेटा देखें। ddply
उत्पादन, जो इस मामले में डिफ़ॉल्ट शाब्दिक आदेश आवश्यक होगा सॉर्ट देगा:
> ddply(d,.(x1,x2),summarise, val = sum(x3))
x1 x2 val
1 a d 5
2 a e 7
3 a f 3
4 b d 17
5 b e 8
6 b f 15
7 c d 13
8 c e 25
9 c f 27
> ddply(d[sample(1:15,15),],.(x1,x2),summarise, val = sum(x3))
x1 x2 val
1 a d 5
2 a e 7
3 a f 3
4 b d 17
5 b e 8
6 b f 15
7 c d 13
8 c e 25
9 c f 27
परिणामी डेटा फ्रेम "सही" आदेश में समाप्त नहीं किया जाता है, यह शायद इसलिए है क्योंकि आप वास्तव में उन में से कुछ चाहते हैं कारकों का आदेश दिया जा सकता है चर। मान लीजिए हम वास्तव में चाहते थे कि x1
और x2
तो तरह का आदेश दिया:
> ddply(d,.(x1,x2),summarise, val = sum(x3))
x1 x2 val
1 b d 17
2 b f 15
3 b e 8
4 a d 5
5 a f 3
6 a e 7
7 c d 13
8 c f 27
9 c e 25
कहानी यहाँ का नैतिक है कि अगर यह है: जब हम ddply
उपयोग करते हैं, जिसके परिणामस्वरूप प्रकार के रूप में हम चाहते हैं हो जाएगा
d$x1 <- factor(d$x1, levels = c('b','a','c'),ordered = TRUE)
d$x2 <- factor(d$x2, levels = c('d','f','e'), ordered = TRUE)
अब ddply
किसी ऑर्डर में कुछ आउटपुट कर रहा है जिसका आप इरादा नहीं रखते थे, यह एक अच्छा संकेत है कि आप जिस चर को विभाजित कर रहे हैं उसके लिए आपको ऑर्डर किए गए कारकों का उपयोग करना चाहिए।
इसमें 'write.table' के साथ कुछ लेना देना नहीं है; शीर्षक बदला जाना चाहिए। –