22854


[Rで生成したデータの前処理](https://ja.stackoverflow.com/questions/17468/r%E3%81%A7%E7%94%9F%E6%88%90%E3%81%97%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%89%8D%E5%87%A6%E7%90%86)  
で以前質問したのですが、dplyrを用いた場合の最後のmutateのところがうまく行きません。

[code]

    params <- expand.grid(p = 1:2, q = 1:1, r = 1:2, s = 1:1)
    ans <- params %>% rowwise() %>% mutate(aic = f(p, q, r, s))
    
[/code]

関数fの部分は単独で変数を指定（コンソールにf(1,1,1,1)などと打ち込む）するとしっかり

返ってきて問題はないようですが、返り値がmatrixになっているためas.data.frameで直すと変なくっつき方をしました（具体的にうまく説明できない）。  
そのため、しっかり横につなげようとmatrixを転地したあとくっつけようとすると

[code]

    Error: incompatible size (4), expecting 1 (the group size) or 1
    
[/code]

のエラーが出ました。そのため、matrixの中身だけ取り出そうと

[code]

    ans <- params %>% rowwise() %>% mutate(aic = f(p, q, r, s)$[1,1]) %>% mutate(bic=f(p, q, r, s)$[1,2])
    
[/code]

とやるとこの場合は$[]を用いてはいけないようでエラーになりました。

詳しい方、ヘルプお願い致します。


CC BY-SA 3.0
2016-03-06T09:55:49.223
22853
2018-03-04T07:10:00.393
2018-03-04T07:10:00.393
12457
12457
question
r tidyverse
dplyrでmatrixをmutateしたい


そのエラーはおそらく、dplyrは関係なく文法上のミスです。`$[]`ではなく`[]`が正しいです。

`f`はこういう結果を返す関数ということであっていますか？

[code]

    f <- function(x,y,z,v) {
      m <- matrix(c(4.108074, 4.112013, 4.108074, 4.109363))
      rownames(m) <- c("Akaike", "Bayes", "Shibata", "Hannan-Quinn")
      m
    }
    #> f(1,1,1,1)
    #>                  [,1]
    #> Akaike       4.108074
    #> Bayes        4.112013
    #> Shibata      4.108074
    #> Hannan-Quinn 4.109363
    
[/code]

もしそうなら、↓のように`[]`を使えば私の手元ではエラーなく動きましたが、いかがでしょうか。

[code]

    ans <- params %>%
      rowwise() %>%
      mutate(aic = f(p, q, r, s)[1,1]) %>%
      mutate(bic = f(p, q, r, s)[1,2])
    
[/code]

ちなみに、この書き方だと`f(p, q, r,
s)`を複数回計算しなおすことになるので、あまり効率よくありません。以下のようにすればいちど計算結果を格納して、そこから値を取り出すことができます。  
あんまりスマートな書き方じゃないですが、今のところこれしか思いつかないのでひとまずこれを回答とさせてください。すみません…

[code]

    ans <- params %>%
      rowwise() %>%
      mutate(result = list(f(p, q, r, s)),
             aic = result[1,1],
             bic = result[2,1])
    ans
    #> Source: local data frame [4 x 7]
    #> Groups: <by row>
    #> 
    #>       p     q     r     s     result      aic      bic
    #>   (int) (int) (int) (int)     (list)    (dbl)    (dbl)
    #> 1     1     1     1     1 <dbl[4,1]> 4.108074 4.112013
    #> 2     2     1     1     1 <dbl[4,1]> 4.108074 4.112013
    #> 3     1     1     2     1 <dbl[4,1]> 4.108074 4.112013
    #> 4     2     1     2     1 <dbl[4,1]> 4.108074 4.112013
    
[/code]


CC BY-SA 3.0
2016-03-06T10:58:45.023
22854
2016-03-06T10:58:45.023
2544
22853
answer