अपडेट 2017-08-03
यह लिखने के बाद, हेडली ने कुछ सामान फिर से बदल दिया। Purrr में जो फ़ंक्शंस होते थे, वे अब purrrlyr नामक एक नए मिश्रित पैकेज में हैं:
purrrlyr में कुछ कार्य होते हैं जो purrr और dplyr के चौराहे पर स्थित होते हैं। पैकेज को हल्का बनाने के लिए उन्हें purrr से हटा दिया गया है और क्योंकि उन्हें tidyverse में अन्य समाधानों द्वारा प्रतिस्थापित किया गया है।
तो, आपको उस कोड को काम के नीचे स्थापित करने के लिए उस पैकेज को + लोड करना होगा।
मूल पोस्ट
हैडली अक्सर अपने दिमाग में बदलाव करते हैं कि हमें क्या उपयोग करना चाहिए, लेकिन मुझे लगता है कि हमें पंक्ति कार्यक्षमता प्राप्त करने के लिए purrr में फ़ंक्शन पर स्विच करना चाहिए । कम से कम, वे एक ही कार्यक्षमता प्रदान करते हैं और लगभग उसी इंटरफ़ेस adply
से होते हैं जैसे कि प्लाई से ।
दो संबंधित कार्य हैं, by_row
और invoke_rows
। मेरी समझ यह है कि आप by_row
तब उपयोग करते हैं जब आप पंक्तियों पर लूप करना चाहते हैं और परिणाम को data.frame में जोड़ते हैं। 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
। मुझे लगता है कि यह यहां भी काम करेगा।