সম্পাদনা:
এই উত্তরটি কতটা প্রশংসিত হয়েছে তা দেওয়া, আমি এখন এটি এখানে উপলব্ধ একটি প্যাকেজ ভিগনেটে রূপান্তর করেছি
এটি প্রায়শই কীভাবে আসে তা বিবেচনা করে, আমি মনে করি এই উপরের জোশ ওব্রায়েন প্রদত্ত সহায়ক উত্তরের চেয়েও কিছুটা বেশি এক্সপোজারী হিসাবে সতর্কতা দেয়।
সাধারণত জোশের দ্বারা উদ্ধৃত / নির্মিত ডি আটা সংক্ষিপ্তসার এস ইউবসেট ছাড়াও , আমি "সেলসাম" বা "স্ব-রেফারেন্স" এর পক্ষে দাঁড়াতে "এস" বিবেচনা করাও সহায়ক বলে মনে করি - এটি তার মূল মৌলিক আঙ্গিকায় রয়েছে আত্মবাচক রেফারেন্স থেকে নিজেই - হিসাবে আমরা নীচে উদাহরণ দেখতে পাবেন, এই একসঙ্গে chaining "প্রশ্নের" (extractions / সাব-সেট নির্বাচন / ব্যবহার ইত্যাদি জন্য বিশেষভাবে সহায়ক )। বিশেষত, এর অর্থ হ'ল এটি নিজেই একটি (যে সাবধানতার সাথে এটি নির্ধারণের অনুমতি দেয় না )।.SDdata.table[.SDdata.table:=
এর সহজ ব্যবহার .SDকলাম সাবসেটিংয়ের জন্য (যেমন, যখন .SDcolsনির্দিষ্ট করা হয়); আমি মনে করি এই সংস্করণটি বোঝার জন্য আরও সহজবোধ্য, তাই আমরা নীচে এটি প্রথমটি coverেকে দেব। .SDএর দ্বিতীয় ব্যবহারের ব্যাখ্যা , গ্রুপিং পরিস্থিতিগুলির অর্থ (যেমন, যখন by =বা keyby =নির্দিষ্ট করা হয়) কিছুটা আলাদা, ধারণামূলকভাবে (যদিও মূলত এটি একই রকম, কারণ সর্বোপরি, একটি নন-গোষ্ঠীভিত্তিক ক্রিয়াকলাপ ন্যায়বিচারের সাথে গ্রুপিংয়ের একটি প্রান্তের কেস একটি গ্রুপ)।
এখানে কিছু বর্ণনামূলক উদাহরণ এবং ব্যবহারের কিছু অন্যান্য উদাহরণ রয়েছে যা আমি নিজে প্রায়শই প্রয়োগ করি:
লাহমান ডেটা লোড হচ্ছে
ডেটা তৈরির পরিবর্তে এটিকে আরও বাস্তব-বিশ্বের অনুভূতি দেওয়ার জন্য আসুন এখান থেকে বেসবল সম্পর্কে কিছু ডেটা সেট লোড করুন Lahman:
library(data.table)
library(magrittr) # some piping can be beautiful
library(Lahman)
Teams = as.data.table(Teams)
# *I'm selectively suppressing the printed output of tables here*
Teams
Pitching = as.data.table(Pitching)
# subset for conciseness
Pitching = Pitching[ , .(playerID, yearID, teamID, W, L, G, ERA)]
Pitching
নগ্ন .SD
এর প্রতিবিম্বিত প্রকৃতি সম্পর্কে আমি কী বোঝাতে চাইছি .SD, এর সর্বাধিক ব্যাল ব্যবহার বিবেচনা করুন:
Pitching[ , .SD]
# playerID yearID teamID W L G ERA
# 1: bechtge01 1871 PH1 1 2 3 7.96
# 2: brainas01 1871 WS3 12 15 30 4.50
# 3: fergubo01 1871 NY2 0 0 1 27.00
# 4: fishech01 1871 RC1 4 16 24 4.35
# 5: fleetfr01 1871 NY2 0 1 1 10.00
# ---
# 44959: zastrro01 2016 CHN 1 0 8 1.13
# 44960: zieglbr01 2016 ARI 2 3 36 2.82
# 44961: zieglbr01 2016 BOS 2 4 33 1.52
# 44962: zimmejo02 2016 DET 9 7 19 4.87
# 44963: zychto01 2016 SEA 1 0 12 3.29
এটি হ'ল আমরা সবেমাত্র ফিরে এসেছি Pitching, অর্থাত্ এটি লেখার একটি অতিরিক্ত ভার্জিক পদ্ধতি Pitchingবা Pitching[]:
identical(Pitching, Pitching[ , .SD])
# [1] TRUE
সাবসেটিংয়ের ক্ষেত্রে, .SD এখনও তথ্যের একটি উপসেট, এটি কেবল একটি তুচ্ছ (সেট নিজেই)।
কলাম সাবসেটিং: .SDcols
যুক্তিটি ব্যবহার করে থাকা কলামগুলিকে.SD সীমাবদ্ধ করে কী তা প্রভাবিত করার প্রথম উপায় :.SD.SDcols[
Pitching[ , .SD, .SDcols = c('W', 'L', 'G')]
# W L G
# 1: 1 2 3
# 2: 12 15 30
# 3: 0 0 1
# 4: 4 16 24
# 5: 0 1 1
# ---
# 44959: 1 0 8
# 44960: 2 3 36
# 44961: 2 4 33
# 44962: 9 7 19
# 44963: 1 0 12
এটি কেবল উদাহরণের জন্য এবং বেশ বিরক্তিকর ছিল। তবে এই সাধারণ ব্যবহারটি নিজেকে বিভিন্ন উপকারী / সর্বব্যাপী ডেটা ম্যানিপুলেশন অপারেশনের বিস্তৃত করে তোলে:
কলামের ধরণের রূপান্তর
ডেটা মংগিংয়ের জন্য কলামের ধরণের রূপান্তর জীবনের সত্য - এই লেখার মতো, fwriteস্বয়ংক্রিয়ভাবে পড়তে Dateবা POSIXctকলামগুলি পড়তে পারে না এবং character/ factor/ numericএর মধ্যে পিছনে রূপান্তরগুলি সাধারণ। আমরা এই জাতীয় কলামগুলির ব্যাচ-রূপান্তরকারী গ্রুপগুলি ব্যবহার করতে .SDএবং .SDcolsকরতে পারি ।
আমরা লক্ষ্য করেছি যে নিম্নলিখিত কলামগুলি ডেটা সেটে সংরক্ষণ করা characterহয়েছে Teams:
# see ?Teams for explanation; these are various IDs
# used to identify the multitude of teams from
# across the long history of baseball
fkt = c('teamIDBR', 'teamIDlahman45', 'teamIDretro')
# confirm that they're stored as `character`
Teams[ , sapply(.SD, is.character), .SDcols = fkt]
# teamIDBR teamIDlahman45 teamIDretro
# TRUE TRUE TRUE
আপনি যদি sapplyএখানে ব্যবহার করে বিভ্রান্ত হন তবে লক্ষ্য করুন যে এটি বেস বেসের মতোই data.frames:
setDF(Teams) # convert to data.frame for illustration
sapply(Teams[ , fkt], is.character)
# teamIDBR teamIDlahman45 teamIDretro
# TRUE TRUE TRUE
setDT(Teams) # convert back to data.table
এই বাক্য গঠনটি বোঝার মূল কথাটি স্মরণ করিয়ে দেওয়া যে একটি data.table(সেই সাথে ক data.frame) এমন এক হিসাবে বিবেচনা করা যেতে পারে listযেখানে প্রতিটি উপাদান একটি কলাম হয় - সুতরাং, sapply/ প্রতিটি কলামেlapply প্রযোজ্য এবং ফলাফলটি / সাধারণত হিসাবে প্রদান করে (এখানে, একটি ফেরত দেয় দৈর্ঘ্য 1, সুতরাং একটি ভেক্টর প্রদান করে)।FUNsapplylapplyFUN == is.characterlogicalsapply
এই কলামগুলিকে রূপান্তর করতে সিনট্যাক্সটি factorখুব অনুরূপ - কেবলমাত্র :=অ্যাসাইনমেন্ট অপারেটর যুক্ত করুন
Teams[ , (fkt) := lapply(.SD, factor), .SDcols = fkt]
মনে রাখবেন আমরা মোড়ানো আবশ্যক fktবন্ধনীর মধ্যে ()আর পরিবর্তে নাম দায়িত্ব অর্পণ করা চেষ্টা কলাম নামে এই ব্যাখ্যা করা, বলপূর্বক fktRHS করতে।
নমনীয়তা .SDcols(এবং :=) একটি গ্রহণ করতে characterভেক্টর বা একটি integerকলাম অবস্থানের ভেক্টর এছাড়াও কলাম নামের প্যাটার্ন-ভিত্তিক রূপান্তর জন্য উপকারে আসতে পারে *। আমরা সমস্ত factorকলামকে এতে রূপান্তর করতে পারি character:
fkt_idx = which(sapply(Teams, is.factor))
Teams[ , (fkt_idx) := lapply(.SD, as.character), .SDcols = fkt_idx]
এবং তারপরে সমস্ত কলামগুলিতে রূপান্তর করুন যা এতে teamফিরে আসে factor:
team_idx = grep('team', names(Teams), value = TRUE)
Teams[ , (team_idx) := lapply(.SD, factor), .SDcols = team_idx]
** স্পষ্টভাবে কলাম নম্বরগুলি (যেমন DT[ , (1) := rnorm(.N)]) ব্যবহার করা খারাপ অভ্যাস এবং কলামের অবস্থানগুলি পরিবর্তিত হলে সময়ের সাথে নিঃশব্দে দূষিত কোডের দিকে পরিচালিত করতে পারে। এমনকি আমরা স্পষ্টভাবে সংখ্যা ব্যবহার করা বিপজ্জনক হতে পারে যদি আমরা সংখ্যাযুক্ত সূচক কখন তৈরি করি এবং আমরা কখন এটি ব্যবহার করি তার ক্রমটির উপরে স্মার্ট / কঠোর নিয়ন্ত্রণ না রাখি।
কোনও মডেলের আরএইচএস নিয়ন্ত্রণ করছে
পরিবর্তনের মডেল স্পেসিফিকেশন মজবুত পরিসংখ্যান বিশ্লেষণের মূল বৈশিষ্ট্য। আসুন চেষ্টা করুন এবং Pitchingটেবিলে উপলব্ধ কোভারিয়েটগুলির ছোট সেটটি ব্যবহার করে কলসের ইআরএ (আর্নড রান রান গড়, পারফরম্যান্সের একটি পরিমাপ) ভবিষ্যদ্বাণী করা যাক । W(জয়) এবং এর মধ্যে ( রৈখিক) সম্পর্ক কীভাবে হয়ERAঅন্যান্য স্পেসিফিকেশনে অন্তর্ভুক্ত করা হয় তার উপর নির্ভর করে পৃথক হয়?
এখানে একটি শর্ট স্ক্রিপ্ট .SDযার শক্তিটি এই প্রশ্নটি অন্বেষণ করে le
# this generates a list of the 2^k possible extra variables
# for models of the form ERA ~ G + (...)
extra_var = c('yearID', 'teamID', 'G', 'L')
models =
lapply(0L:length(extra_var), combn, x = extra_var, simplify = FALSE) %>%
unlist(recursive = FALSE)
# here are 16 visually distinct colors, taken from the list of 20 here:
# https://sashat.me/2017/01/11/list-of-20-simple-distinct-colors/
col16 = c('#e6194b', '#3cb44b', '#ffe119', '#0082c8', '#f58231', '#911eb4',
'#46f0f0', '#f032e6', '#d2f53c', '#fabebe', '#008080', '#e6beff',
'#aa6e28', '#fffac8', '#800000', '#aaffc3')
par(oma = c(2, 0, 0, 0))
sapply(models, function(rhs) {
# using ERA ~ . and data = .SD, then varying which
# columns are included in .SD allows us to perform this
# iteration over 16 models succinctly.
# coef(.)['W'] extracts the W coefficient from each model fit
Pitching[ , coef(lm(ERA ~ ., data = .SD))['W'], .SDcols = c('W', rhs)]
}) %>% barplot(names.arg = sapply(models, paste, collapse = '/'),
main = 'Wins Coefficient with Various Covariates',
col = col16, las = 2L, cex.names = .8)

সহগের সর্বদা প্রত্যাশিত চিহ্ন থাকে (আরও ভাল কলস আরও জিততে এবং কম রানের অনুমতি দেওয়া হয়) তবে আমরা কীসের জন্য আরও নিয়ন্ত্রণ করি তার উপর নির্ভর করে বিশালতা যথেষ্ট পরিবর্তিত হতে পারে।
শর্তযুক্ত যোগদান
data.tableসিনট্যাক্স তার সরলতা এবং দৃust়তার জন্য সুন্দর। বাক্যবিন্যাসটি x[i]সাবসেটিংয়ের জন্য দুটি সাধারণ পন্থাটি নমনীয়ভাবে পরিচালনা করে - যখন iকোনও logicalভেক্টর থাকে, x[i]সেই সারিগুলি xযেখানে iরয়েছে তার সাথে ফিরিয়ে দেবে TRUE; যখন iহয় অন্যdata.table একটা join, প্লেইন আকারে (সঞ্চালিত হয় ব্যবহার keyএর গুলি xএবং i, অন্যথায়, যখনon = উল্লেখিত থাকে, তবে সেই কলামের ম্যাচ ব্যবহার করে)।
এটি সাধারণভাবে দুর্দান্ত, তবে যখন আমরা শর্তযুক্ত যোগদান করতে চাই তখন সংক্ষিপ্ত হয় , যার মধ্যে সারণির মধ্যে সম্পর্কের সঠিক প্রকৃতি এক বা একাধিক কলামের সারিগুলির কয়েকটি বৈশিষ্ট্যের উপর নির্ভর করে।
এই উদাহরণটি স্বল্প পরিমাণে সংযুক্ত, তবে ধারণাটি চিত্রিত করে; আরও দেখুন এখানে ( 1 , 2 )।
লক্ষ্যটি হ'ল টেবিলে একটি কলাম যুক্ত team_performanceকরা যা Pitchingপ্রতিটি দলের সেরা কলসীর দলের কর্মক্ষমতা (র্যাঙ্ক) রেকর্ড করে (কমপক্ষে recorded টি রেকর্ড করা গেমের সাথে পিচারগুলির মধ্যে সর্বনিম্ন ইআরএ দ্বারা পরিমাপ করা হয়)।
# to exclude pitchers with exceptional performance in a few games,
# subset first; then define rank of pitchers within their team each year
# (in general, we should put more care into the 'ties.method'
Pitching[G > 5, rank_in_team := frank(ERA), by = .(teamID, yearID)]
Pitching[rank_in_team == 1, team_performance :=
# this should work without needing copy();
# that it doesn't appears to be a bug:
# https://github.com/Rdatatable/data.table/issues/1926
Teams[copy(.SD), Rank, .(teamID, yearID)]]
নোট করুন যে x[y]বাক্য গঠনটি nrow(y)মানগুলি দেয়, যে কারণে .SDডানদিকে থাকে Teams[.SD](যেহেতু :=এই ক্ষেত্রে আরএইচএসের nrow(Pitching[rank_in_team == 1])মান প্রয়োজন ।
দলবদ্ধ .SDক্রিয়াকলাপ
প্রায়শই, আমরা গ্রুপ পর্যায়ে আমাদের ডেটাতে কিছু অপারেশন করতে চাই । যখন আমরা নির্দিষ্ট by =(বা keyby =) নির্দিষ্ট করি, তখন data.tableপ্রক্রিয়াগুলি যখন jআপনাকে data.tableঅনেকগুলি উপাদান সাব-এসগুলিতে বিভক্ত হিসাবে ভাবা হয় তার জন্য মানসিক মডেল হ'ল data.tableপ্রত্যেকটি আপনার byপরিবর্তনশীল (গুলি) এর একক মানের সাথে মিল রাখে:

এই ক্ষেত্রে, .SDপ্রকৃতি একাধিক - এটা এই উপ-প্রতিটি বোঝায় data.table, এস এক-এ-এ-সময় (সামান্য বেশি নির্ভুলভাবে, পরিধি .SDএকটি একক উপ হয় data.table)। এটি আমাদের সংক্ষিপ্তভাবে একটি অপারেশন প্রকাশ করতে দেয় যা আমরা পুনরায় একত্রিত ফলাফলটি আমাদের কাছে ফেরত দেওয়ার আগে আমরা প্রতিটি উপdata.table - উপস্থাপিত করতে চাই ।
এটি বিভিন্ন সেটিংসে দরকারী, যার মধ্যে সর্বাধিক সাধারণ এখানে উপস্থাপন করা হয়েছে:
গ্রুপ সাবসেটিং
আসুন লাহমান ডেটাতে প্রতিটি দলের জন্য অতি সাম্প্রতিক ডেটা আসুন। এটি বেশ সহজভাবে এর মাধ্যমে করা যেতে পারে:
# the data is already sorted by year; if it weren't
# we could do Teams[order(yearID), .SD[.N], by = teamID]
Teams[ , .SD[.N], by = teamID]
পুনরাহ্বান যে .SDনিজেই একটি হল data.table, এবং যে .Nএকটি গ্রুপ (এটা সমান সারি মোট সংখ্যা উল্লেখ করে nrow(.SD)প্রতিটি দলের মধ্যে), তাই .SD[.N]ফেরৎ সম্পূর্ণতা.SD চূড়ান্ত প্রতিটি সঙ্গে যুক্ত সারিতে teamID।
এর অন্য একটি সাধারণ সংস্করণ হ'ল .SD[1L]পরিবর্তে প্রতিটি দলের জন্য প্রথম পর্যবেক্ষণ পাওয়ার জন্য ব্যবহার করা।
গ্রুপ অপটিমা
ধরা যাক আমরা প্রতিটি দলের হয়ে সেরা বছরটি ফিরিয়ে দিতে চেয়েছি , যতগুলি তাদের রান করা মোট সংখ্যা দ্বারা পরিমাপ করা হয় ( R; আমরা অবশ্যই অন্যান্য মেট্রিকগুলিতে উল্লেখ করার জন্য এটি সহজেই সামঞ্জস্য করতে পারি)। প্রতিটি উপ- থেকে একটি নির্দিষ্ট উপাদান নেওয়ার পরিবর্তে data.table, আমরা এখন নিম্নলিখিত হিসাবে পছন্দসই সূচকটি গতিশীলভাবে সংজ্ঞায়িত করি :
Teams[ , .SD[which.max(R)], by = teamID]
মনে রাখবেন যে এই পদ্ধতির অবশ্যই প্রতিটিটির জন্য .SDcolsকেবলমাত্র কিছু অংশ ফিরে পাওয়ার জন্য একত্রিত করা যেতে পারে (যে সাবধানতাটি বিভিন্ন উপসাগর জুড়ে স্থির করা উচিত)data.table.SD.SDcols
এনবি : .SD[1L]বর্তমানে GForce( আরও দেখুন ), data.tableঅভ্যন্তরীণরা যেগুলি সবচেয়ে সাধারণ গ্রুপযুক্ত ক্রিয়াকলাপগুলিকে ব্যাপকভাবে গতি দেয় sumবা mean- ?GForceআরও বিশদ বিবরণ দেখুন এবং এই ফ্রন্টের আপডেটগুলির জন্য বৈশিষ্ট্য উন্নতির অনুরোধগুলির জন্য / ভয়েস সাপোর্টের দিকে নজর রাখবে : দ্বারা অভ্যন্তরীণগুলি বর্তমানে অনুকূলিত হয়েছে : 1 , 2 , 3 , 4 , 5 , 6
গ্রুপযুক্ত রিগ্রেশন ression
ERAএবং এর মধ্যে সম্পর্কের বিষয়ে উপরের তদন্তে ফিরে আসা W, ধরুন আমরা আশা করি এই সম্পর্কটি দলের দ্বারা পৃথক হবে (অর্থাত, প্রতিটি দলের জন্য আলাদা aাল রয়েছে)। নিম্নরূপে এই সম্পর্কের বৈচিত্র্য অন্বেষণ করতে আমরা সহজেই এই রিগ্রেশনটি আবার চালাতে পারি (এই পদ্ধতির মানক ত্রুটিগুলি সাধারণত ভুল বলে উল্লেখ করে - স্পেসিফিকেশনটি ERA ~ W*teamIDআরও ভাল হবে - এই পদ্ধতিটি পড়া সহজ এবং সহগুণগুলি ঠিক আছে) :
# use the .N > 20 filter to exclude teams with few observations
Pitching[ , if (.N > 20) .(w_coef = coef(lm(ERA ~ W))['W']), by = teamID
][ , hist(w_coef, 20, xlab = 'Fitted Coefficient on W',
ylab = 'Number of Teams', col = 'darkgreen',
main = 'Distribution of Team-Level Win Coefficients on ERA')]

বৈষম্যতার মোটামুটি পরিমাণ থাকা অবস্থায়, পর্যবেক্ষণকৃত সামগ্রিক মানটির চারপাশে একটি স্বতন্ত্র ঘনত্ব রয়েছে
আশা করি এটি .SDসুন্দর, দক্ষ কোডগুলিতে সুবিধার্থে শক্তিটির বর্ণনা দিয়েছে data.table!
?data.tableএই প্রশ্নের জন্য ধন্যবাদ, v1.7.10 এ উন্নত হয়েছিল। এটি এখন.SDস্বীকৃত উত্তর অনুসারে নামটি ব্যাখ্যা করে ।