2015-02-08 4 views
6

पर क्लिक करके dplyr का उपयोग करके, मैं एक वैरिएबल द्वारा [sic] सारांशित करना चाहता हूं जिसे मैं बदल सकता हूं (उदा। लूप या लागू-शैली कमांड में)।प्रोग्रामिंग रूप से group_by() को एक भिन्न चर

सीधे में नाम लिखकर ठीक काम करता है:

library(dplyr) 
ChickWeight %>% group_by(Chick, Diet) %>% summarise(mw = mean(weight)) 

लेकिन group_by, एक चरित्र वेक्टर लेने के लिए नहीं लिखा गया था तो परिणामों में गुजर कठिन है।

v <- "Diet" 
ChickWeight %>% group_by(c("Chick", v)) %>% summarise(mw = mean(weight)) 
## Error 

मैं एक समाधान पोस्ट करूंगा, लेकिन यह देखने के लिए उत्सुक है कि दूसरों ने इसे कैसे हल किया है।

+1

:-) 'संक्षेप [एसआईसी] '+1 –

+4

बस' group_by_ (सी (" चिक ", v) के बजाय 'group_by_ (c (" चिक ", v))' ' –

+0

@Ari यदि आप अमेरिकी वर्तनी का उपयोग करते हैं, तो आप कोड में 'सारांश' का उपयोग क्यों करते हैं? –

उत्तर

11

अंडरस्कोर dplyr के कार्यों के लिए उपयोगी हो सकता है:

ChickWeight %>% group_by_("Chick", v) %>% summarise(mw = mean(weight)) 
new features in dplyr 0.3 से

:

अब आप dplyr के साथ प्रोग्राम कर सकते हैं - गैर-मानक मूल्यांकन (एनएसई) का उपयोग करने वाले प्रत्येक फ़ंक्शन में मानक मूल्यांकन (एसई) जुड़वां भी होता है जो _ में समाप्त होता है। उदाहरण के लिए, फ़िल्टर() के एसई संस्करण को फिल्टर _() कहा जाता है। प्रत्येक फ़ंक्शन के एसई संस्करण में समान तर्क होते हैं, लेकिन उन्हें स्पष्ट रूप से "उद्धृत" होना चाहिए।

0

यहां एक समाधान है और मैं इस पर कैसे पहुंचा।

group_by क्या अपेक्षा करता है?

> dplyr:::named_dots 
function (...) 
{ 
    auto_name(dots(...)) 
} 
<environment: namespace:dplyr> 
> dplyr:::auto_name 
function (x) 
{ 
    names(x) <- auto_names(x) 
    x 
} 
<environment: namespace:dplyr> 
> dplyr:::auto_names 
function (x) 
{ 
    nms <- names2(x) 
    missing <- nms == "" 
    if (all(!missing)) 
     return(nms) 
    deparse2 <- function(x) paste(deparse(x, 500L), collapse = "") 
    defaults <- vapply(x[missing], deparse2, character(1), USE.NAMES = FALSE) 
    nms[missing] <- defaults 
    nms 
} 
<environment: namespace:dplyr> 
> dplyr:::names2 
function (x) 
{ 
    names(x) %||% rep("", length(x)) 
} 

कि जानकारी, कैसे एक समाधान क्राफ्टिंग के बारे में जाने के लिए उपयोग करते हुए:

> group_by 
function (x, ..., add = FALSE) 
{ 
    new_groups <- named_dots(...) 
नीचे खरगोश की मांद

?

# Naive solution fails: 
ChickWeight %>% do.call(group_by, list(Chick, Diet)) %>% summarise(mw = mean(weight)) 

# Slightly cleverer: 
do.call(group_by, list(x = ChickWeight, Chick, Diet, add = FALSE)) %>% summarise(mw = mean(weight)) 
## But still fails with, 
## Error in do.call(group_by, list(x = ChickWeight, Chick, Diet, add = FALSE)) : object 'Chick' not found 

समाधान तर्क के हवाले से तो उनके मूल्यांकन देरी हो रही है में निहित है, जब तक वे वातावरण है कि x tbl शामिल में कर रहे हैं:

do.call(group_by, list(x = ChickWeight, quote(Chick), quote(Diet), add = FALSE)) %>% summarise(mw = mean(weight)) 
## Bingo! 
v <- "Diet" 
do.call(group_by, list(x = ChickWeight, quote(Chick), substitute(a, list(a = v)), add = FALSE)) %>% summarise(mw = mean(weight)) 
संबंधित मुद्दे