17

元のデータ フレームからサブセットを作成し、dplyr の SELECT と MUTATE を使用して、がく片/花びらの幅と長さの合計に基づいて大小のエントリの数を取得する関数をまとめようとしています。 .

filter <- function (spp, LENGTH, WIDTH) {
  d <- subset (iris, subset=iris$Species == spp) # This part seems to work just fine
  large <- d %>%                       
    select (LENGTH, WIDTH) %>%   # This is where the problem arises.
    mutate (sum = LENGTH + WIDTH) 
  big_samples <- which(large$sum > 4)
 return (length(big_samples)) 
}

基本的には、大きな花の数を返す関数が欲しいです。ただし、関数を実行すると、次のエラーが発生します-

filter("virginica", "Sepal.Length", "Sepal.Width")

 Error: All select() inputs must resolve to integer column positions.
The following do not:
*  LENGTH
*  WIDTH 

私は何を間違っていますか?

4

3 に答える 3

21

NSE/SE の問題が発生しています。詳細については、ビネットを参照してください

簡単に言えば、dplyr名前の非標準評価 (NSE) を使用し、列の名前を関数に渡すと、標準評価 (SE) バージョンを使用せずにそれが壊れます。

関数の SE バージョンはdplyr_ で終わります。select_元の引数とうまく機能することがわかります。

ただし、関数を使用すると、事態はさらに複雑になります。lazyeval::interpほとんどの関数引数を列名に変換するために使用できます。以下の関数で呼び出すmutateへの変換とmutate_、より一般的なヘルプを参照してください。?lazyeval::interp

試す:

filter <- function (spp, LENGTH, WIDTH) {
    d <- subset (iris, subset=iris$Species == spp) 
    large <- d %>%                       
        select_(LENGTH, WIDTH) %>%  
        mutate_(sum = lazyeval::interp(~X + Y, X = as.name(LENGTH), Y = as.name(WIDTH))) 
    big_samples <- which(large$sum > 4)
    return (length(big_samples)) 
}
于 2015-12-09T19:12:05.760 に答える