আপডেট 2017-08-03
এটি লেখার পরে, হ্যাডলি আবার কিছু জিনিস পরিবর্তন করে। Purrr এ যে ফাংশন ব্যবহৃত হত সেগুলি এখন purrrlyr নামে একটি নতুন মিশ্র প্যাকেজে রয়েছে , যা বর্ণিত:
purrrlyr purrr এবং dplyr এর ছেদ এ অবস্থিত কিছু ফাংশন রয়েছে। প্যাকেজটি আরও হালকা করার জন্য এগুলি purrr থেকে অপসারণ করা হয়েছে এবং কারণ তারা পরিশ্রমের অন্যান্য সমাধানগুলি দ্বারা প্রতিস্থাপিত হয়েছে।
সুতরাং, নীচের কোডটি তৈরি করতে আপনাকে + প্যাকেজটি লোড করতে হবে।
আসল পোস্ট
আমাদের কী ব্যবহার করা উচিত সে সম্পর্কে হ্যাডলি প্রায়শই তার মন পরিবর্তন করে, তবে আমি মনে করি আমাদের সারি কার্যকারিতাটি পেতে পিউরারের ফাংশনগুলিতে স্যুইচ করার কথা রয়েছে । কমপক্ষে, তারা একই কার্যকারিতা সরবরাহ করে এবং প্লাইরadply
থেকে প্রায় একই ইন্টারফেস থাকে ।
দুটি সম্পর্কিত ফাংশন আছে, by_row
এবং invoke_rows
। আমার বোধগম্যতা হল আপনি by_row
যখন সারিগুলিকে লুপ করতে এবং ফলাফলটি ডেটা.ফ্রেমে যুক্ত করতে চান তখন আপনি ব্যবহার করেন। invoke_rows
আপনি যখন একটি ডাটা.ফ্রেম সারি সারি লুপ এবং প্রতিটি ফাংশন একটি আর্গুমেন্ট হিসাবে প্রতিটি কোল পাস যখন ব্যবহৃত হয়। আমরা কেবল প্রথমটি ব্যবহার করব।
উদাহরণ
library(tidyverse)
iris %>%
by_row(..f = function(this_row) {
browser()
})
এটি আমাদের অভ্যন্তরীণ দেখতে দেয় (যাতে আমরা কী করছি তা দেখতে পাচ্ছি), যা এটি করার মতোই adply
।
Called from: ..f(.d[[i]], ...)
Browse[1]> this_row
# A tibble: 1 × 5
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
<dbl> <dbl> <dbl> <dbl> <fctr>
1 5.1 3.5 1.4 0.2 setosa
Browse[1]> Q
ডিফল্ট হিসাবে, by_row
আউটপুট উপর ভিত্তি করে একটি তালিকা কলাম যুক্ত করে:
iris %>%
by_row(..f = function(this_row) {
this_row[1:4] %>% unlist %>% mean
})
দেয়:
# A tibble: 150 × 6
Sepal.Length Sepal.Width Petal.Length Petal.Width Species .out
<dbl> <dbl> <dbl> <dbl> <fctr> <list>
1 5.1 3.5 1.4 0.2 setosa <dbl [1]>
2 4.9 3.0 1.4 0.2 setosa <dbl [1]>
3 4.7 3.2 1.3 0.2 setosa <dbl [1]>
4 4.6 3.1 1.5 0.2 setosa <dbl [1]>
5 5.0 3.6 1.4 0.2 setosa <dbl [1]>
6 5.4 3.9 1.7 0.4 setosa <dbl [1]>
7 4.6 3.4 1.4 0.3 setosa <dbl [1]>
8 5.0 3.4 1.5 0.2 setosa <dbl [1]>
9 4.4 2.9 1.4 0.2 setosa <dbl [1]>
10 4.9 3.1 1.5 0.1 setosa <dbl [1]>
# ... with 140 more rows
পরিবর্তে আমরা যদি একটি ফিরে আসি data.frame
, আমরা data.frame
এর সাথে একটি তালিকা পাই :
iris %>%
by_row( ..f = function(this_row) {
data.frame(
new_col_mean = this_row[1:4] %>% unlist %>% mean,
new_col_median = this_row[1:4] %>% unlist %>% median
)
})
দেয়:
# A tibble: 150 × 6
Sepal.Length Sepal.Width Petal.Length Petal.Width Species .out
<dbl> <dbl> <dbl> <dbl> <fctr> <list>
1 5.1 3.5 1.4 0.2 setosa <data.frame [1 × 2]>
2 4.9 3.0 1.4 0.2 setosa <data.frame [1 × 2]>
3 4.7 3.2 1.3 0.2 setosa <data.frame [1 × 2]>
4 4.6 3.1 1.5 0.2 setosa <data.frame [1 × 2]>
5 5.0 3.6 1.4 0.2 setosa <data.frame [1 × 2]>
6 5.4 3.9 1.7 0.4 setosa <data.frame [1 × 2]>
7 4.6 3.4 1.4 0.3 setosa <data.frame [1 × 2]>
8 5.0 3.4 1.5 0.2 setosa <data.frame [1 × 2]>
9 4.4 2.9 1.4 0.2 setosa <data.frame [1 × 2]>
10 4.9 3.1 1.5 0.1 setosa <data.frame [1 × 2]>
# ... with 140 more rows
আমরা কীভাবে ফাংশনের আউটপুট যুক্ত করব তা .collate
প্যারাম দ্বারা নিয়ন্ত্রিত হয় । তিনটি বিকল্প রয়েছে: তালিকা, সারি, কলস। যখন আমাদের আউটপুটটির দৈর্ঘ্য 1 থাকবে, আমরা সারি বা কর্ণ ব্যবহার করি তা বিবেচনা করে না।
iris %>%
by_row(.collate = "cols", ..f = function(this_row) {
this_row[1:4] %>% unlist %>% mean
})
iris %>%
by_row(.collate = "rows", ..f = function(this_row) {
this_row[1:4] %>% unlist %>% mean
})
উভয় উত্পাদন:
# A tibble: 150 × 6
Sepal.Length Sepal.Width Petal.Length Petal.Width Species .out
<dbl> <dbl> <dbl> <dbl> <fctr> <dbl>
1 5.1 3.5 1.4 0.2 setosa 2.550
2 4.9 3.0 1.4 0.2 setosa 2.375
3 4.7 3.2 1.3 0.2 setosa 2.350
4 4.6 3.1 1.5 0.2 setosa 2.350
5 5.0 3.6 1.4 0.2 setosa 2.550
6 5.4 3.9 1.7 0.4 setosa 2.850
7 4.6 3.4 1.4 0.3 setosa 2.425
8 5.0 3.4 1.5 0.2 setosa 2.525
9 4.4 2.9 1.4 0.2 setosa 2.225
10 4.9 3.1 1.5 0.1 setosa 2.400
# ... with 140 more rows
আমরা যদি 1 সারি দিয়ে একটি ডেটা ফ্রেম আউটপুট করে থাকি তবে এটি কেবল সামান্যই গুরুত্বপূর্ণ যা আমরা ব্যবহার করি:
iris %>%
by_row(.collate = "cols", ..f = function(this_row) {
data.frame(
new_col_mean = this_row[1:4] %>% unlist %>% mean,
new_col_median = this_row[1:4] %>% unlist %>% median
)
})
iris %>%
by_row(.collate = "rows", ..f = function(this_row) {
data.frame(
new_col_mean = this_row[1:4] %>% unlist %>% mean,
new_col_median = this_row[1:4] %>% unlist %>% median
)
})
উভয়ই প্রদান:
# A tibble: 150 × 8
Sepal.Length Sepal.Width Petal.Length Petal.Width Species .row new_col_mean new_col_median
<dbl> <dbl> <dbl> <dbl> <fctr> <int> <dbl> <dbl>
1 5.1 3.5 1.4 0.2 setosa 1 2.550 2.45
2 4.9 3.0 1.4 0.2 setosa 2 2.375 2.20
3 4.7 3.2 1.3 0.2 setosa 3 2.350 2.25
4 4.6 3.1 1.5 0.2 setosa 4 2.350 2.30
5 5.0 3.6 1.4 0.2 setosa 5 2.550 2.50
6 5.4 3.9 1.7 0.4 setosa 6 2.850 2.80
7 4.6 3.4 1.4 0.3 setosa 7 2.425 2.40
8 5.0 3.4 1.5 0.2 setosa 8 2.525 2.45
9 4.4 2.9 1.4 0.2 setosa 9 2.225 2.15
10 4.9 3.1 1.5 0.1 setosa 10 2.400 2.30
# ... with 140 more rows
এটি বাদে দ্বিতীয়টির কলামটি আছে .row
এবং প্রথমটি নেই।
অবশেষে, যদি আমাদের আউটপুটটি দৈর্ঘ্য 1 এর চেয়ে দীর্ঘ হয় হয় হয় সারি vector
হিসাবে বা একটি হিসাবে data.frame
, তবে এটি গুরুত্বপূর্ণ যে আমরা সারি বা কর্স ব্যবহার করব .collate
:
mtcars[1:2] %>% by_row(function(x) 1:5)
mtcars[1:2] %>% by_row(function(x) 1:5, .collate = "rows")
mtcars[1:2] %>% by_row(function(x) 1:5, .collate = "cols")
উত্পাদন, যথাক্রমে:
# A tibble: 32 × 3
mpg cyl .out
<dbl> <dbl> <list>
1 21.0 6 <int [5]>
2 21.0 6 <int [5]>
3 22.8 4 <int [5]>
4 21.4 6 <int [5]>
5 18.7 8 <int [5]>
6 18.1 6 <int [5]>
7 14.3 8 <int [5]>
8 24.4 4 <int [5]>
9 22.8 4 <int [5]>
10 19.2 6 <int [5]>
# ... with 22 more rows
# A tibble: 160 × 4
mpg cyl .row .out
<dbl> <dbl> <int> <int>
1 21 6 1 1
2 21 6 1 2
3 21 6 1 3
4 21 6 1 4
5 21 6 1 5
6 21 6 2 1
7 21 6 2 2
8 21 6 2 3
9 21 6 2 4
10 21 6 2 5
# ... with 150 more rows
# A tibble: 32 × 7
mpg cyl .out1 .out2 .out3 .out4 .out5
<dbl> <dbl> <int> <int> <int> <int> <int>
1 21.0 6 1 2 3 4 5
2 21.0 6 1 2 3 4 5
3 22.8 4 1 2 3 4 5
4 21.4 6 1 2 3 4 5
5 18.7 8 1 2 3 4 5
6 18.1 6 1 2 3 4 5
7 14.3 8 1 2 3 4 5
8 24.4 4 1 2 3 4 5
9 22.8 4 1 2 3 4 5
10 19.2 6 1 2 3 4 5
# ... with 22 more rows
সুতরাং, নীচের লাইন। আপনি যদি adply(.margins = 1, ...)
কার্যকারিতা চান তবে আপনি এটি ব্যবহার করতে পারেন by_row
।
mdply
dplyr, এবং প্রস্তাবিত হ্যাডলি যে তারা বানানোর উপর ভিত্তি করে কিছু হতে পারেdo
। আমার ধারণা এটি এখানেও কাজ করবে।