2017-09-25 5 views
0

dplyrのrowwise()とパイプを使用して、データフレーム内の各行に関数(リストを返す)を適用したいと考えています。単純な関数(それは8の追加については明らかに、リストを返す関数についてではありません)の定義Rのパイプでdplyrのrowwise()を使用して各行にリストを返す関数を適用するにはどうすればよいですか?

test_tbl <- tibble(a=c(2, 4), b=c(0, 8), c=c(5, -3)) 

:2行の

テストデータセット

simple_function <- function(input) { 
    list(input + 8) 
} 

は、これは私が望むものです

apply(test_tbl ,1, function (x) simple_function(x)) 

これは2つのリスト(私の希望する出力)のリストを返します。

私はそれらのリストをチブルの列として保存したいと思います。私たちは何ができる:

:私はむしろ(また、コードの読みやすさのために)dplyr、ベース、およびパイプを混合よりもdplyrを使用したいが、これは動作しない理由を私は理解していない

test_tbl %>% mutate(output = apply(. ,1, function (x) simple_function(x))) 

test_tbl %>% rowwise() %>% simple_function 
test_tbl %>% rowwise() %>% mutate(output = simple_function(.)) 

これらの関数はどちらも、別々の行ではなくデータフレーム全体に関数を適用します。 test_tbl %>% rowwise() %>% simple_functionは、所望の出力が得られないtest_tbl %>% simple_function

これに(出力の面で)同じですが、私は列を自分自身をバインドする必要があること、それはかなり冗長ではない理想的な見つける:それはように私には意味がありません

test_tbl %>% rowwise() %>% do(output= simple_function(.)) %>% bind_cols(test_tbl, .) 

rowwise()が失敗している理由についての助けがあれば大歓迎です。私たちは、 `test_tbl%>%mutate_all(低速運行(。+ 8))必要

+0

内の関数を適用し'。なぜ出力が 'list'であるべきかは不明です。そうでない場合は、単に 'mutate_all'の中に追加してください。 – akrun

+0

単純な関数が例です。私が適用したい機能はもっと複雑です(これは列の値に基づいていくつかのデータフレームを生成します)。重要な点は、リスト列が形成され、各行ごとにリストが作成されることです。 – Gert

答えて

1

私たちはそれぞれの行でこれを行うために必要がある場合は、splitmap

library(tidyverse) 
test_tbl %>% 
    split(., seq_len(nrow(.))) %>% 
    map(simple_function) 
#$`1` 
#$`1`[[1]] 
# a b c 
#1 10 8 13 


#$`2` 
#$`2`[[1]] 
# a b c 
#1 12 16 5 
関連する問題