तुम्हारी पसंद
order
से base
arrange
से dplyr
setorder
और setorderv
सेdata.table
arrange
से plyr
sort
से taRifx
orderBy
से doBy
sortData
से Deducer
ज्यादातर समय आपको dplyr
या data.table
समाधान का उपयोग करना चाहिए , जब तक कि कोई निर्भरता महत्वपूर्ण न हो, जिस स्थिति में उपयोग करें base::order
।
मैंने हाल ही में एक CRAN पैकेज में Sort.data.frame जोड़ा है, जिससे यहां चर्चा के रूप में वर्ग संगत हो जाता है:
Sort.data.frame के लिए सामान्य / विधि स्थिरता बनाने का सबसे अच्छा तरीका है?
इसलिए, data.frame dd को देखते हुए, आप निम्न प्रकार से कर सकते हैं:
dd <- data.frame(b = factor(c("Hi", "Med", "Hi", "Low"),
levels = c("Low", "Med", "Hi"), ordered = TRUE),
x = c("A", "D", "A", "C"), y = c(8, 3, 9, 9),
z = c(1, 1, 1, 2))
library(taRifx)
sort(dd, f= ~ -z + b )
यदि आप इस समारोह के मूल लेखकों में से एक हैं, तो कृपया मुझसे संपर्क करें। सार्वजनिक डोमेन के रूप में चर्चा यहाँ है: http://chat.stackoverflow.com
आप arrange()
फ़ंक्शन का उपयोग भी कर सकते हैं जैसा plyr
कि हेडली ने उपरोक्त सूत्र में बताया है:
library(plyr)
arrange(dd,desc(z),b)
बेंचमार्क: ध्यान दें कि मैंने प्रत्येक पैकेज को नए आर सत्र में लोड किया था क्योंकि बहुत सारे संघर्ष थे। विशेष रूप से doBy पैकेज को लोड करने के कारण sort
"x (स्थिति 17): b, x, y, z" से निम्नलिखित ऑब्जेक्ट (ओं) को वापस लाया जाता है और sort.data.frame
केविन राइट या taififx पैकेज से Deducer पैकेज को अधिलेखित किया जाता है।
#Load each time
dd <- data.frame(b = factor(c("Hi", "Med", "Hi", "Low"),
levels = c("Low", "Med", "Hi"), ordered = TRUE),
x = c("A", "D", "A", "C"), y = c(8, 3, 9, 9),
z = c(1, 1, 1, 2))
library(microbenchmark)
# Reload R between benchmarks
microbenchmark(dd[with(dd, order(-z, b)), ] ,
dd[order(-dd$z, dd$b),],
times=1000
)
माध्य समय:
dd[with(dd, order(-z, b)), ]
778
dd[order(-dd$z, dd$b),]
788
library(taRifx)
microbenchmark(sort(dd, f= ~-z+b ),times=1000)
माध्य समय: 1,567
library(plyr)
microbenchmark(arrange(dd,desc(z),b),times=1000)
माध्य समय: ian६२
library(doBy)
microbenchmark(orderBy(~-z+b, data=dd),times=1000)
माध्य समय: 1,694
ध्यान दें कि doBy पैकेज को लोड करने में अच्छा समय लेता है।
library(Deducer)
microbenchmark(sortData(dd,c("z","b"),increasing= c(FALSE,TRUE)),times=1000)
Deducer लोड नहीं कर सका। JGR कंसोल की आवश्यकता है।
esort <- function(x, sortvar, ...) {
attach(x)
x <- x[with(x,order(sortvar,...)),]
return(x)
detach(x)
}
microbenchmark(esort(dd, -z, b),times=1000)
अटैच / डिटैच होने के कारण माइक्रोबेनमार्क के साथ संगत प्रतीत नहीं होता है।
m <- microbenchmark(
arrange(dd,desc(z),b),
sort(dd, f= ~-z+b ),
dd[with(dd, order(-z, b)), ] ,
dd[order(-dd$z, dd$b),],
times=1000
)
uq <- function(x) { fivenum(x)[4]}
lq <- function(x) { fivenum(x)[2]}
y_min <- 0 # min(by(m$time,m$expr,lq))
y_max <- max(by(m$time,m$expr,uq)) * 1.05
p <- ggplot(m,aes(x=expr,y=time)) + coord_cartesian(ylim = c( y_min , y_max ))
p + stat_summary(fun.y=median,fun.ymin = lq, fun.ymax = uq, aes(fill=expr))
(लाइनें निम्न चतुर्थक से ऊपरी चतुर्थक तक विस्तृत होती हैं, डॉट माध्यिका है)
इन परिणामों को देखते हुए और सरलता बनाम वजन की गति को देखते हुए, मुझे पैकेज arrange
में जानकारीplyr
देनी होगी । इसका एक सरल वाक्यविन्यास है और फिर भी लगभग उतना ही तेज है जितना कि आर आर उनके दृढ़ तंत्र के साथ कमांड करता है। आमतौर पर शानदार हैडली विकम काम करते हैं। इसके साथ मेरी एकमात्र पकड़ यह है कि यह मानक आर नामकरण को तोड़ता है जहां सॉर्टिंग ऑब्जेक्ट्स को कॉल किया जाता है sort(object)
, लेकिन मुझे समझ में आता है कि हेडली ने ऊपर दिए गए प्रश्न में चर्चा के मुद्दों के कारण ऐसा क्यों किया।