2016-10-24 3 views
0

マイデータを変異させ、次のようになります予期しない値dplyrにカスタム関数を適用しながらは::

library(tidyverse) 

df <- tribble(
    ~y_val, ~z_val, 
    2, 4, 
    5, 3, 
    8, 2, 
    1, 1, 
    9, 3) 

私はdplyrとデータフレームに適用する::コールを変異させたいカスタム関数fun_b()を持っています。しかし、fun_b()は、その中のループを持っている機能fun_a()を使用しています。私は、カスタム関数を実行すると

fun_a <- function(x, y, z, times = 1) { 

    df <- data.frame() 
    for (i in 1:times) { 
     x <- x * 2 + i * x 
     y <- y/3 + i * y 
     z <- z + 1 + z * i 
    d <- data.frame(x, y, z) 
    df <- rbind(df, d) 
    } 
    return(df) 
} 

fun_b <- function(x, y, z, times = 1) { 
    df <- fun_a(x, y, z, times) 
    x_r <- sum(df$x) 
    y_r <- sum(df$y) 
    z_r <- sum(df$z) 
    val <- x_r/y_r * z_r 
    return(val) 
} 

df %>% 
    mutate(test = fun_b(x = 1, y = y_val, z = z_val, times = 1)) 

testのすべての変異した値が同じ値(13.95)を示しています。それは意味をなさない!たとえば、チーフ(y_val = 2, z_val = 4)の最初の行は10.125です。

fun_b(x = 1, y = 2, z = 4, times = 1) 

ここでは何が起こっていますか?

+0

'sum'呼び出しを取り出して、あなたのために' 'd''%' '%rowwise()%>% mutate(test = fun_b(x = 1、y = y_val、z = z_val、times = 1)関数はベクトル化可能です – alistaire

答えて

1

あなたは、関数が行ごとに個別に評価されますので、グループの行方向を次のことができます。

df %>% 
    rowwise() %>% 
    mutate(test = fun_b(x = 1, y = y_val, z = z_val, times = 1)) 

## Source: local data frame [5 x 3] 
## Groups: <by row> 
## 
## # A tibble: 5 × 3 
## y_val z_val  test 
## <dbl> <dbl> <dbl> 
## 1  2  4 10.12500 
## 2  5  3 3.15000 
## 3  8  2 1.40625 
## 4  1  1 6.75000 
## 5  9  3 1.75000 

またはそれがベクトル化されますので、取得、または単にRせるfun_bを編集:あなただけのグループに必要

df %>% mutate(test = Vectorize(fun_b)(x = 1, y = y_val, z = z_val, times = 1)) 

## # A tibble: 5 × 3 
## y_val z_val  test 
## <dbl> <dbl> <dbl> 
## 1  2  4 10.12500 
## 2  5  3 3.15000 
## 3  8  2 1.40625 
## 4  1  1 6.75000 
## 5  9  3 1.75000 
1

は、それは10.125私を得、次の

df %>% 
    group_by(y_val, z_val) %>% 
    mutate(test = fun_b(x = 1, y = y_val, z = z_val, times = 1)) 

を試してみてください。

関連する問題