2017-10-24 3 views
2

データ型が混在する関数があります。データフレームと文字列変数を入力パラメータとして受け取ります。Purrrマップのパラメータとしてデータフレームと不均一なベクトルを渡す方法


library(dplyr) 


myfunc <- function (dat=NULL,species=NULL,sepal_thres=NULL) { 
dat %>% 
    filter(Species==species & Sepal.Length <= sepal_thres) 

} 

myfunc(dat=iris,species="virginica",sepal_thres=5) 
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
#> 1   4.9   2.5   4.5   1.7 virginica 

しかし、私はこのエラーを得たベクトル

species_vecs <- c("virginica","setosa") 
sepal_thres_vecs <- c(5, 6) 
purrr::pmap(list(dat=iris, species=species_vecs, sepal_thres=sepal_thres_vecs), myfunc) 

のリストでそれを適用したい:

Error: Element 2 has length 2, not 1 or 5. 

それを行うための正しい方法は何ですか? speciessepal_tresパラメータは、この組み合わせから取られ

ないこと:パラメータとして

> expand.grid(species_vecs,sepal_thres_vecs) %>% rename(species=Var1, sepal_thres=Var2) 
    species sepal_thres 
1 virginica   5 
2 setosa   5 
3 virginica   6 
4 setosa   6 

しかしdatが固定されています。

答えて

1

あなたはこのソリューションを使用することができます。

expand.grid(species_vecs,sepal_thres_vecs) %>% 
    rename(species=Var1, sepal_thres=Var2) %>% 
    as.tibble() %>% 
    mutate(sum = map2(as.character(species), sepal_thres,myfunc,dat = iris)) %>% 
    unnest(sum) 
1

あなたはあなたの大きなリストの一部として長さ-1の要素を持っている場合はリサイクルを使用しますVectorize

input <- expand.grid(species_vecs,sepal_thres_vecs,stringsAsFactors = F) %>% rename(species=Var1, sepal_thres=Var2) 
#  species sepal_thres 
# 1 virginica   5 
# 2 setosa   5 
# 3 virginica   6 
# 4 setosa   6 
output <- Vectorize(myfunc,c("species","sepal_thres"),SIMPLIFY=F)(dat=iris,species=input[[1]],sepal_thres=input[[2]]) 
output[[1]] 
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
# 1   4.9   2.5   4.5   1.7 virginica 
output[[3]] 
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
# 1   5.8   2.7   5.1   1.9 virginica 
# 2   4.9   2.5   4.5   1.7 virginica 
# 3   5.7   2.5   5.0   2.0 virginica 
# 4   5.8   2.8   5.1   2.4 virginica 
# 5   6.0   2.2   5.0   1.5 virginica 
# 6   5.6   2.8   4.9   2.0 virginica 
# 7   6.0   3.0   4.8   1.8 virginica 
# 8   5.8   2.7   5.1   1.9 virginica 
# 9   5.9   3.0   5.1   1.8 virginica 
2

pmapを使用することができます。この場合、フルリスト内のリスト要素としてirisを渡して、各種別の組み合わせに使用することができます。

pmapは、表示される順序で複数の値を持つリスト要素を通過することに注意してください。 pmapに種とsepalベクターの組み合わせがすべて必要な場合は、完全なベクトルを作成してリスト要素として渡す必要があります(つまり、自分で交差する必要があります)。

purrr::pmap(list(dat = list(iris), species = rep(species_vecs, 2), 
       sepal_thres = rep(sepal_thres_vecs, each = 2)), myfunc) 

[[1]] 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
1   4.9   2.5   4.5   1.7 virginica 

[[2]] 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
1   4.9   3.0   1.4   0.2 setosa 
2   4.7   3.2   1.3   0.2 setosa 
3   4.6   3.1   1.5   0.2 setosa 
4   5.0   3.6   1.4   0.2 setosa 
5   4.6   3.4   1.4   0.3 setosa 
6   5.0   3.4   1.5   0.2 setosa 
... 
関連する問題