Dplyr ব্যবহার করে একটি টেবিলের প্রতিটি সারিতে একটি ফাংশন প্রয়োগ করছেন?


121

সাথে কাজ করার সময় plyrআমি প্রায়শই adplyস্কেলার ফাংশনগুলির জন্য ব্যবহার করা দরকারী মনে করি যা আমাকে প্রতিটি এবং প্রতিটি সারিতে প্রয়োগ করতে হয়।

যেমন

data(iris)
library(plyr)
head(
     adply(iris, 1, transform , Max.Len= max(Sepal.Length,Petal.Length))
    )
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species Max.Len
1          5.1         3.5          1.4         0.2  setosa     5.1
2          4.9         3.0          1.4         0.2  setosa     4.9
3          4.7         3.2          1.3         0.2  setosa     4.7
4          4.6         3.1          1.5         0.2  setosa     4.6
5          5.0         3.6          1.4         0.2  setosa     5.0
6          5.4         3.9          1.7         0.4  setosa     5.4

এখন আমি dplyrআরও ব্যবহার করছি , আমি ভাবছি যে এটি করার মতো কোনও পরিষ্কার / প্রাকৃতিক উপায় আছে? যেহেতু এটি আমি চাই তা নয় :

library(dplyr)
head(
     mutate(iris, Max.Len= max(Sepal.Length,Petal.Length))
    )
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species Max.Len
1          5.1         3.5          1.4         0.2  setosa     7.9
2          4.9         3.0          1.4         0.2  setosa     7.9
3          4.7         3.2          1.3         0.2  setosa     7.9
4          4.6         3.1          1.5         0.2  setosa     7.9
5          5.0         3.6          1.4         0.2  setosa     7.9
6          5.4         3.9          1.7         0.4  setosa     7.9

আমি সম্প্রতি যদি একটি সমতুল্য ছিল জিজ্ঞাসা mdplydplyr, এবং প্রস্তাবিত হ্যাডলি যে তারা বানানোর উপর ভিত্তি করে কিছু হতে পারে do। আমার ধারণা এটি এখানেও কাজ করবে।
ব্যাপটিস্ট

4
শেষ পর্যন্ত dplyr এর মতো কিছু থাকবে rowwise()যা প্রতিটি স্বতন্ত্র সারির দ্বারা ভাগ করে নেবে
হ্যাডলি

@ হডলি থ্যাक्स, adplyআপনি যখন গ্রুপিং ব্যবহার করবেন না তখন কি এমন আচরণ করা উচিত নয় ? যেহেতু এর ঘনিষ্ঠভাবে সংহত ফাংশনটিকে group_byনট বলা হয়split_by
স্টিফেন হেন্ডারসন

@ স্টেফেনহেন্ডারসন না, কারণ পুরো টেবিলে আপনার চালনার জন্যও কিছু উপায় প্রয়োজন।
হ্যাডলি

1
@ হাওয়াইয়াডিং হ্যাঁ তবে সেই পদ্ধতিটি সাধারণীকরণ করেনা। উদাহরণস্বরূপ কোনও সাঁওতাল, pmean বা pmedian নেই।
স্টিফেন হেন্ডারসন

উত্তর:


202

Dplyr 0.2 হিসাবে (আমার মনে হয়) rowwise()কার্যকর করা হয়েছে, সুতরাং এই সমস্যার উত্তর হয়ে যায়:

iris %>% 
  rowwise() %>% 
  mutate(Max.Len= max(Sepal.Length,Petal.Length))

rowwiseবিকল্প

পাঁচ বছর (!) পরে এই উত্তরটি এখনও প্রচুর ট্র্যাফিক পায়। যেহেতু এটি দেওয়া হয়েছিল, rowwiseক্রমবর্ধমান সুপারিশ করা হয় না, যদিও প্রচুর লোকেরা এটি স্বজ্ঞাত বলে মনে হয়। এই বিষয়টিতে একটি ভাল হ্যান্ডেল পাওয়ার জন্য আপনার নিজের পক্ষে একটি সুবিধা করুন এবং জেনি ব্রায়ানের রো-ওরিয়েন্টড ওয়ার্কফ্লোগুলি টিতে পরিপাটি উপাদান সহ আর এ যান

সর্বাধিক সোজা উপায় আমি খুঁজে পেয়েছি হ্যাডলির অন্যতম উদাহরণ ব্যবহার করে pmap:

iris %>% 
  mutate(Max.Len= purrr::pmap_dbl(list(Sepal.Length, Petal.Length), max))

এই পদ্ধতির ব্যবহার করে, আপনি .fভিতরে ফাংশনটি ( ) এর একটি ইচ্ছামত যুক্তি দিতে পারেন pmap

pmap এটি একটি আদর্শ ধারণাগত পদ্ধতির কারণ এটি প্রতিফলিত করে যে আপনি যখন সারি ভিত্তিক অপারেশন করছেন তখন আপনি প্রকৃত ভেক্টরের একটি তালিকা (কোনও ডাটাফ্রেমের কলাম) থেকে টিপলসের সাথে কাজ করছেন।


আমি এটিকে (উপরের দিক থেকে) আদর্শ উত্তরে পরিবর্তন করেছি কারণ আমি মনে করি এটিই হ'ল উদ্দেশ্যযুক্ত ব্যবহার।
স্টিফেন হেন্ডারসন

1
গতিশীলভাবে গঠিত ডেটাফ্রেমের মান যুক্ত করা কি সম্ভব? সুতরাং এই ডেটা ফ্রেমে কলামের নামগুলি জানা যায় না। কলামের নাম জানা থাকলে আমি যুক্ত করতে সক্ষম am
অরুণ রাজা

stackoverflow.com/questions/28807266/… সবেমাত্র উত্তরটি খুঁজে পেয়েছে। এতে তারা যোগফলের পরিবর্তে পারস্পরিক সম্পর্ক ব্যবহার করছে। তবে একই ধারণা।
অরুণ রাজা

13
আমাকে বাদাম ঘটেছে - যদি এটা কাজ করে না, আপনি আসলে dplyr :: পরিবর্তন ঘটান ব্যবহার করছেন না plyr :: পরিবর্তন ঘটান নিশ্চিত
Jan-GLX

ধন্যবাদ ইয়াক, আমাকেও এই বিট। যদি আপনি উভয় plyrএবং dplyrপ্যাকেজগুলি অন্তর্ভুক্ত করেন mutateতবে আপনি স্পষ্টভাবে সুযোগ প্রদান না করে আপনি প্রায় অবশ্যই ভুল ব্যবহার করছেন dplyr::mutate
ক্রিস ওয়ার্থ

22

আইডোমেটিক পদ্ধতির একটি উপযুক্তভাবে ভেক্টরাইজড ফাংশন তৈরি করা হবে।

Rপ্রদান pmaxযা এখানে উপযুক্ত, তবে এটি প্রদান করে Vectorizeএকটি মোড়কের যেমন mapplyআপনি একটি অবাধ ফাংশন একটি vectorised নির্বিচারে সংস্করণ তৈরী করতে অনুমতি দেয়।

library(dplyr)
# use base R pmax (vectorized in C)
iris %>% mutate(max.len = pmax(Sepal.Length, Petal.Length))
# use vectorize to create your own function
# for example, a horribly inefficient get first non-Na value function
# a version that is not vectorized
coalesce <- function(a,b) {r <- c(a[1],b[1]); r[!is.na(r)][1]}
# a vectorized version
Coalesce <- Vectorize(coalesce, vectorize.args = c('a','b'))
# some example data
df <- data.frame(a = c(1:5,NA,7:10), b = c(1:3,NA,NA,6,NA,10:8))
df %>% mutate(ab =Coalesce(a,b))

নোট করুন যে সি / সি ++ তে ভেক্টরাইজেশন বাস্তবায়ন করা দ্রুত হবে তবে magicPonyআপনার জন্য ফাংশনটি লিখবে এমন কোনও প্যাকেজ নেই।


থেক্স, এটি একটি দুর্দান্ত উত্তর, আপনি যেমন বলছেন ঠিক তেমন সাধারণ আর স্টাইল-ইডিয়োমেটিক, তবে আমি মনে করি না যে এটি আমার প্রশ্নটির সত্যই কোনও dplyrউপায় আছে কিনা তা সম্বোধন করে ... যেমন এটি ডাইপ্লায়ার ছাড়াই সহজ হবে যেমন with(df, Coalesce(a,b))সম্ভবত, এটি একটি যদিও উত্তর ধরনের - এর dplyrজন্য ব্যবহার করবেন না ?
স্টিফেন হেন্ডারসন

4
স্বীকার করতে হবে আমি ডাবল চেক করেছি যে কোনও magicPonyপ্যাকেজ নেই। খুব খারাপ
রোরোরেন

21

আপনার সারি অনুসারে গ্রুপ করা দরকার:

iris %>% group_by(1:n()) %>% mutate(Max.Len= max(Sepal.Length,Petal.Length))

এটিই তাই 1করেছিল adply


দেখে মনে হচ্ছে একটি সরল বা "ভাল" সিনট্যাক্স থাকা উচিত।
স্টিফেন হেন্ডারসন

@ স্টেফেনহেন্ডারসন, সেখানে থাকতে পারে, আমি dplyrবিশেষজ্ঞ নই । আশা করি আরও ভাল কিছু নিয়ে অন্য কেউ আসবেন। নোট আমি এটি দিয়ে কিছুটা পরিষ্কার করেছি 1:n()
ব্রোডিজি

আমি সন্দেহ করি যে আপনি ঠিক বলেছেন, কিন্তু আমার মনে হয় বাছাইয়ের সাথে পূর্বনির্ধারিত আচরণটি কোনও গ্রুপিংয়ের সাথে আচরণের মতো হওয়া উচিত নয় group_by(1:n())। সকালে কারও কারও কাছে অন্য ধারণা না থাকলে আমি আপনাকে টিক দেব;)
স্টিফেন হেন্ডারসন

এছাড়াও, নোট করুন যে এটি ডকুমেন্টেশনের কিছুটা লঙ্ঘন হিসাবে রয়েছে n: "এই ফাংশনটি প্রতিটি ডেটা উত্সের জন্য বিশেষভাবে প্রয়োগ করা হয় এবং কেবল সংক্ষিপ্তকরণের মধ্যে থেকে এটি ব্যবহার করা যায়।" যদিও এটি কাজ করে বলে মনে হচ্ছে।
ব্রোডিজি

আপনি কি কোনও উপায়ে তাদের সূচক নম্বর দ্বারা সেপাল.লাইনথ এবং পেটাল.লংথ উল্লেখ করতে পারেন? আপনার যদি প্রচুর পরিমাণে ভেরিয়েবল থাকে তবে তা কার্যকর হবে। লাইক ... ম্যাক্সেলেন = সর্বোচ্চ ([সি (1,3)])?
রাসমুস লারসেন

19

আপডেট 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


2
by_rowঅবহেলিত, কল করে বলা হয়েছে "tidyr :: nest (); dplyr :: mutate (); purrr
মোমারা

এটি অনেকটা আর।
qwr

14

ব্রডিজির উত্তর প্রসারিত করা,

চেয়ে ফাংশন আয় আরো এক সারি, তাহলে পরিবর্তে mutate(), do()ব্যবহার করা আবশ্যক। তারপরে এটি আবার একত্রিত rbind_all()করতে dplyrপ্যাকেজটি থেকে ব্যবহার করুন ।

ইন dplyrসংস্করণ dplyr_0.1.2ব্যবহার 1:n()মধ্যে group_by()দফা আমার জন্য কাজ করে না। আশা করি শিগগিরই হ্যাডলি বাস্তবায়ন করবেনrowwise()

iris %>%
    group_by(1:nrow(iris)) %>%
    do(do_fn) %>%
    rbind_all()

পারফরম্যান্স পরীক্ষা,

library(plyr)    # plyr_1.8.4.9000
library(dplyr)   # dplyr_0.8.0.9000
library(purrr)   # purrr_0.2.99.9000
library(microbenchmark)

d1_count <- 1000
d2_count <- 10

d1 <- data.frame(a=runif(d1_count))

do_fn <- function(row){data.frame(a=row$a, b=runif(d2_count))}
do_fn2 <- function(a){data.frame(a=a, b=runif(d2_count))}

op <- microbenchmark(
        plyr_version = plyr::adply(d1, 1, do_fn),
        dplyr_version = d1 %>%
            dplyr::group_by(1:nrow(d1)) %>%
            dplyr::do(do_fn(.)) %>%
            dplyr::bind_rows(),
        purrr_version = d1 %>% purrr::pmap_dfr(do_fn2),
        times=50)

এটির নিম্নলিখিত ফলাফল রয়েছে:

Unit: milliseconds
          expr       min        lq      mean    median        uq       max neval
  plyr_version 1227.2589 1275.1363 1317.3431 1293.5759 1314.4266 1616.5449    50
 dplyr_version  977.3025 1012.6340 1035.9436 1025.6267 1040.5882 1449.0978    50
 purrr_version  609.5790  629.7565  643.8498  644.2505  656.1959  686.8128    50

এটি দেখায় যে নতুন purrrসংস্করণটি দ্রুততম


1

এটার মতো কিছু?

iris$Max.Len <- pmax(iris$Sepal.Length, iris$Petal.Length)

1
হ্যাঁ THX, এটি একটি খুব নির্দিষ্ট উত্তর। তবে আমার উদাহরণ এবং প্রশ্নটি যদি dplyrকোনও স্কেলারের কার্যকারণের জন্য কোনও সাধারণ সমাধান থাকে তবে তা ছড়িয়ে দেওয়ার চেষ্টা করছে ।
স্টিফেন হেন্ডারসন

সাধারণভাবে, ফাংশনগুলি ভেক্টরাইজ করা উচিত - এটি যদি একটি উদ্বেগজনক ফাংশন হয় তবে আপনি লিখতে পারেন wacky.function <- function(col.1, col.2){...}এবং তারপরেও iris.wacky <- wacky.function(iris$Sepal.Length, iris$Petal.Length)
কলকারোল

প্রায়ই তারা আমি উচিত, কিন্তু আমি মনে করি যখন আপনি ভালো কিছু ব্যবহার করছেন dplyrবা plyrবলুন বা data.tableআপনি তাদের বাগধারার ব্যবহার করতে যাতে আপনার কোড শৈলী ভাগ মিশ্রণ করার জন্য একটি কঠিন না হয়ে চেষ্টা করা উচিত। সুতরাং প্রশ্ন।
স্টিফেন হেন্ডারসন

plyrডকুমেন্টেশনের প্রথম লাইনটি হ'ল প্লাইর হ'ল সরঞ্জামগুলির একটি সেট যা একটি সাধারণ সমস্যা সমাধান করে: আপনার একটি বড় সমস্যা পরিচালনা করে টুকরো টুকরো করে প্রতিটি টুকরো টুকরো করে পরিচালনা করতে হবে এবং তারপরে সমস্ত টুকরো একসাথে রেখে দিতে হবে। এটি একেবারে অন্যরকম সমস্যার মতো মনে হচ্ছে যার জন্য প্রাথমিক কলাম অপারেশনগুলি সেরা সরঞ্জাম। এটি এটি ব্যাখ্যা করতে পারে কেন এটি করার জন্য কোনও "প্রাকৃতিক" plyr/ dplyrআদেশ নেই।
কলকারোল

5
একটি বিখ্যাত উক্তি কসাই করার জন্য: "আপনার যদি সমস্ত কিছু প্লাইর হয় তবে আপনি এটি হাতুড়ি এবং স্ক্রু ড্রাইভারের জন্যও ব্যবহার করতে পারেন "
থেটমেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.