আপনি এই ধরণের সাবসেটিং করতে পারবেন না $
। উত্স কোডে ( 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