मैं सी नामक एक चरित्र वेक्टर को सॉर्ट करना चाहता हूं:

c<-c("AD 2017", "AD 2018 ","RT 2017","BL 2017","BL 2018","CT 2018"

यदि मैं आर के अंतर्निहित फ़ंक्शन प्रकार का उपयोग करता हूं, तो मुझे यही मिलता है:

> sort(c)
[1] "AD 2017"  "AD 2018 " "BL 2017"  "BL 2018"  "CT 2018"  "RT 2017"

हालांकि, मान लें कि मेरे पास मूल्यों के लिए एक अलग ऑर्डरिंग सिस्टम है, जिसे मैट्रिक्स में रखा जाता है और इस तरह दिखता है:

  ORDER VALUE
1     1    RT
2     2    BL
3     3    AD
4     4    CT

सवाल यह है कि मैं अपने "सी" वेक्टर को कैसे सॉर्ट कर सकता हूं ताकि यह विभिन्न वर्षों को ध्यान में रखते हुए मैट्रिक्स से ऑर्डर का उपयोग कर सके; मेरा "कस्टम" सॉर्ट किया गया वेक्टर इस तरह दिखना चाहिए:

> special_sort(c)
[1] "RT 2017" , "BL 2017" , "BL 2018", "AD 2017" , "AD 2018 " , "CT 2018"

मुझे वास्तव में इसे स्वचालित करने का एक तरीका खोजने की ज़रूरत है, क्योंकि मेरा डेटाबेस काफी बड़ा है।

आपकी सहायताके लिए अग्रिम में आपका शुक्रिया

2
Andrei Constantinescu 28 नवम्बर 2019, 13:14

4 जवाब

आंकड़े

vector <- c("AD 2017", "AD 2018 ","RT 2017","BL 2017","BL 2018","CT 2018")

आदेश समारोह

order_fun <- function(vector) {
  df <- data.frame(do.call(rbind, strsplit(vector, " ")))
  df$X1 <- factor(df$X1, levels = c("RT", "BL", "AD", "CT"), labels = c("RT", "BL", "AD", "CT"))
  df <- df[order(df$X1, df$X2), ]
  vector_ordered <- vector[as.numeric(row.names(df))]
  return(vector_ordered)
}

वन-लाइनर ऑर्डर करना

vector[order(factor(substr(vector,1,2), levels = c("RT", "BL", "AD", "CT")), substr(vector,4,7))]

परिणाम

order_fun(vector)
[1] "RT 2017"  "BL 2017"  "BL 2018"  "AD 2017"  "AD 2018 " "CT 2018" 
1
Esben Eickhardt 29 नवम्बर 2019, 11:43

एक अन्य विकल्प हो सकता है:

x[order(match(substr(x, 1, 2), df$VALUE))]

[1] "RT 2017"  "BL 2017"  "BL 2018"  "AD 2017"  "AD 2018 " "CT 2018" 

नमूना डेटा:

x <- c("AD 2017", "AD 2018 ","RT 2017","BL 2017","BL 2018","CT 2018")

df <- read.table(text = "  ORDER VALUE
1     1    RT
                 2     2    BL
                 3     3    AD
                 4     4    CT",
                 header = TRUE,
                 stringsAsFactors = FALSE)
2
tmfmnk 28 नवम्बर 2019, 13:27

आप कुछ इस तरह की कोशिश कर सकते हैं:

# order it by the first two characters, using the levels of factor choosen
v[order(factor(substr(v,1,2),levels = c("RT","BL","AD","CT")))]
[1] "RT 2017"  "BL 2017"  "BL 2018"  "AD 2017"  "AD 2018 " "CT 2018"

तो एक मैट्रिक्स के साथ:

# use the second column of the matrix in unique(), to order
v[order(factor(substr(v,1,2),levels = unique(mat[,2])))]
[1] "RT 2017"  "BL 2017"  "BL 2018"  "AD 2017"  "AD 2018 " "CT 2018" 

वेक्टर और मैट्रिक्स के साथ:

# your vector
v<-c("AD 2017", "AD 2018 ","RT 2017","BL 2017","BL 2018","CT 2018")

# your matrix
mat <- structure(c("1", "2", "3", "4", "RT", "BL", "AD", "CT"), .Dim = c(4L, 
2L), .Dimnames = list(c("1", "2", "3", "4"), c("ORDER", "VALUE"
)))
2
s__ 28 नवम्बर 2019, 13:39

सुनिश्चित नहीं हैं कि आपने year को समान वर्णमाला उपसर्ग का सामना करते समय भी ध्यान में रखा है। यदि आपके पास है, तो निम्नलिखित आपकी मदद कर सकते हैं

res <- c[order(
  match(gsub("([[:alpha:]]+).*","\\1",v),df$VALUE),
  sort(as.numeric(gsub(".*?([[:digit:]]+)","\\1",v))))]

जो देता है

> res
[1] "RT 2017"  "BL 2017"  "BL 2018"  "AD 2017" 
[5] "AD 2018 " "CT 2018" 

अन्यथा, c[order(match(gsub("([[:alpha:]]+).*","\\1",v),df$VALUE))] उपयोग के लिए पर्याप्त है यदि आप केवल df$VALUE के आदेश की परवाह करते हैं

डेटा:

df <- structure(list(ORDER = 1:4, VALUE = c("RT", "BL", "AD", "CT")), class = "data.frame", row.names = c("1", 
"2", "3", "4"))
1
ThomasIsCoding 28 नवम्बर 2019, 15:01