7

dplyr を使用して、[sic] を変更可能な変数で要約したいと思います (たとえば、ループまたは適用スタイルのコマンドで)。

名前を直接入力しても問題ありません。

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つの解決策を投稿しますが、他の人がこれをどのように解決したかを知りたいです.

4

2 に答える 2

11

dplyr のアンダースコア関数は、そのために役立ちます。

ChickWeight %>% group_by_( "Chick", v )  %>% summarise( mw = mean( weight ) )

dplyr 0.3の新機能から:

dplyr を使用してプログラミングできるようになりました。非標準評価 (NSE) を使用するすべての関数には、. で終わる標準評価 (SE) ツインもあります_。たとえば、filter() の SE バージョンは filter() と呼ばれます_。各関数の SE バージョンには同様の引数がありますが、明示的に「引用符で囲む」必要があります。

于 2015-02-08T00:45:56.520 に答える
0

これが1つの解決策であり、私がそれに到達した方法です。

group_by は何を期待していますか?

> group_by
function (x, ..., add = FALSE) 
{
    new_groups <- named_dots(...)

不思議な方向へ転がる:

> 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))
}

その情報を使用して、ソリューションを作成するにはどうすればよいでしょうか?

# 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 ) )
于 2015-02-08T00:22:11.720 に答える