এই উত্তরটি বিদ্যমান উত্তরের মতো একই উপাদানগুলির অনেকটিকে কভার করবে, তবে এই সমস্যাটি (কলামের নামগুলি ফাংশনগুলিতে প্রেরণ করা) প্রায়শই যথেষ্ট আসে যে আমি সেখানে এমন উত্তর চেয়েছিলাম যা কিছুটা আরও বিস্তৃতভাবে coveredাকা থাকে।
মনে করুন আমাদের একটি খুব সাধারণ ডেটা ফ্রেম রয়েছে:
dat <- data.frame(x = 1:4,
y = 5:8)
এবং আমরা এমন একটি ফাংশন লিখতে চাই যা একটি নতুন কলাম তৈরি করে z
যা কলামগুলির সমষ্টি x
এবং y
।
এখানে একটি খুব সাধারণ হোঁচট খাচ্ছে যে একটি প্রাকৃতিক (তবে ভুল) প্রচেষ্টা প্রায়শই এরকম দেখাচ্ছে:
foo <- function(df,col_name,col1,col2){
df$col_name <- df$col1 + df$col2
df
}
#Call foo() like this:
foo(dat,z,x,y)
এখানে সমস্যাটি হ'ল df$col1
অভিব্যক্তিটি মূল্যায়ন করে না col1
। এটি কেবল df
আক্ষরিক নামে পরিচিত একটি কলামের সন্ধান করে col1
। এই আচরণটি ?Extract
"পুনরাবৃত্ত (তালিকার মতো) অবজেক্টস" বিভাগে বর্ণিত হয়েছে ।
সবচেয়ে সহজ এবং অধিকাংশ প্রায়ই সুপারিশ সমাধান কেবল থেকে সুইচ হয় $
যাও [[
স্ট্রিং হিসেবে এবং ফাংশন আর্গুমেন্ট পাস:
new_column1 <- function(df,col_name,col1,col2){
#Create new column col_name as sum of col1 and col2
df[[col_name]] <- df[[col1]] + df[[col2]]
df
}
> new_column1(dat,"z","x","y")
x y z
1 1 5 6
2 2 6 8
3 3 7 10
4 4 8 12
এটিকে প্রায়শই "সেরা অনুশীলন" হিসাবে বিবেচনা করা হয় কারণ এটি এমন পদ্ধতি যা স্ক্রু করা সবচেয়ে কঠিন। স্ট্রিং হিসাবে কলামের নামগুলি পাস করা ততই দ্ব্যর্থহীন get
নিম্নলিখিত দুটি বিকল্প আরও উন্নত। অনেক জনপ্রিয় প্যাকেজ কৌশল এই ধরনের ব্যবহার করতে, কিন্তু তাদের ব্যবহার ভাল , আরো যত্ন ও দক্ষতা প্রয়োজন হিসাবে তারা সূক্ষ্ম জটিলতার এবং ব্যর্থতার অপ্রত্যাশিত পয়েন্ট পরিচয় করিয়ে দিতে পারেন। হ্যাডলির অ্যাডভান্সড আর বইয়ের এই বিভাগটি এই কয়েকটি বিষয়ের জন্য একটি চমৎকার রেফারেন্স।
আপনি যদি এই সমস্ত উদ্ধৃতিটি টাইপ করা থেকে সত্যই ব্যবহারকারীর সংরক্ষণ করতে চান তবে একটি বিকল্প হতে পারে খালি, অব্যক্ত কলামের নামগুলি স্ট্রিংয়ে রূপান্তর করে deparse(substitute())
:
new_column2 <- function(df,col_name,col1,col2){
col_name <- deparse(substitute(col_name))
col1 <- deparse(substitute(col1))
col2 <- deparse(substitute(col2))
df[[col_name]] <- df[[col1]] + df[[col2]]
df
}
> new_column2(dat,z,x,y)
x y z
1 1 5 6
2 2 6 8
3 3 7 10
4 4 8 12
এটি সত্যিই, কিছুটা নির্বোধ সম্ভবত, যেহেতু আমরা new_column1
খালি নামগুলি স্ট্রিংয়ে রূপান্তর করতে কেবল অতিরিক্ত কাজ করে যাচ্ছি ঠিক তেমন কাজ করছি ।
পরিশেষে, আমরা যদি সত্যই অভিনব হতে চাই , আমরা সিদ্ধান্ত নিতে পারি যে দুটি কলামের নাম যুক্ত করার পরিবর্তে আমরা আরও নমনীয় হতে চাই এবং দুটি ভেরিয়েবলের অন্য সংমিশ্রণের অনুমতি দিতে চাই। eval()
সেক্ষেত্রে আমরা সম্ভবত দুটি কলাম জড়িত একটি এক্সপ্রেশন ব্যবহার করে অবলম্বন করব :
new_column3 <- function(df,col_name,expr){
col_name <- deparse(substitute(col_name))
df[[col_name]] <- eval(substitute(expr),df,parent.frame())
df
}
কেবল মজাদার জন্য, আমি এখনও deparse(substitute())
নতুন কলামটির নাম ব্যবহার করছি । এখানে, নীচের সমস্তগুলি কাজ করবে:
> new_column3(dat,z,x+y)
x y z
1 1 5 6
2 2 6 8
3 3 7 10
4 4 8 12
> new_column3(dat,z,x-y)
x y z
1 1 5 -4
2 2 6 -4
3 3 7 -4
4 4 8 -4
> new_column3(dat,z,x*y)
x y z
1 1 5 5
2 2 6 12
3 3 7 21
4 4 8 32
সুতরাং সংক্ষিপ্ত উত্তরটি মূলত: ডাটা.ফ্রেমে কলামের নামগুলি স্ট্রিং হিসাবে পাস [[
করুন এবং একক কলাম নির্বাচন করতে ব্যবহার করুন। শুধু ঢোকাতে শুরু eval
, substitute
ইত্যাদি যদি সত্যিই জানি তুমি কি করছেন।