आप उस तरह की सबसेट नहीं कर सकते $
। स्रोत कोड में ( R/src/main/subset.c
) यह बताता है:
/ * $ सबसेट ऑपरेटर।
हमें केवल पहले तर्क का मूल्यांकन करने के लिए सुनिश्चित होना चाहिए।
दूसरा एक प्रतीक होगा जिसका मिलान किया जाना चाहिए, मूल्यांकन नहीं किया जाना चाहिए।
* /
दूसरा तर्क? क्या?! आप को एहसास है कि है $
आर में सब कुछ की तरह, (उदाहरण के लिए सहित (
, +
, ^
आदि) एक समारोह, कि तर्क लेता है और मूल्यांकन किया जाता है है। df$V1
के रूप में फिर से लिखा जा सकता है
`$`(df , V1)
या वास्तव में
`$`(df , "V1")
परंतु...
`$`(df , paste0("V1") )
... उदाहरण के लिए, कभी काम नहीं करेगा, और न ही कुछ और होगा जिसका पहले दूसरे तर्क में मूल्यांकन किया जाना चाहिए। आप केवल एक स्ट्रिंग पास कर सकते हैं जो कभी नहीं होती है मूल्यांकन किया जाता है।
इसके बजाय उपयोग करें [
(या [[
यदि आप वेक्टर के रूप में केवल एक कॉलम निकालना चाहते हैं)।
उदाहरण के लिए,
var <- "mpg"
#Doesn't work
mtcars$var
#These both work, but note that what they return is different
# the first is a vector, the second is a data.frame
mtcars[[var]]
mtcars[var]
आप do.call
कॉल का निर्माण करने के लिए , लूप के बिना ऑर्डर कर सकते हैं order
। यहाँ एक प्रतिलिपि प्रस्तुत करने योग्य उदाहरण नीचे दिया गया है:
# set seed for reproducibility
set.seed(123)
df <- data.frame( col1 = sample(5,10,repl=T) , col2 = sample(5,10,repl=T) , col3 = sample(5,10,repl=T) )
# We want to sort by 'col3' then by 'col1'
sort_list <- c("col3","col1")
# Use 'do.call' to call order. Seccond argument in do.call is a list of arguments
# to pass to the first argument, in this case 'order'.
# Since a data.frame is really a list, we just subset the data.frame
# according to the columns we want to sort in, in that order
df[ do.call( order , df[ , match( sort_list , names(df) ) ] ) , ]
col1 col2 col3
10 3 5 1
9 3 2 2
7 3 2 3
8 5 1 3
6 1 5 4
3 3 4 4
2 4 3 4
5 5 1 4
1 2 5 5
4 5 3 5