2016-07-22 5 views
0

私はベクトル化しようとしてきた関数をif(){}からifelse()に持っています。関数のすべての引数が、処理中のデータセット内に含まれている場合はうまく動作しますが、文字列として引数を指定すると、ベクトル化が停止し、最初の結果がデータセット全体に使用されます。ここで与えられた変数を持つ関数をベクトル化する

はしかし、私は別で、この機能を使用したい。これは、私が何を期待VAR1とVAR2

> dat 
    var1 var2 var3 
1 0 a zero 
2 1 a 1 
3 0 a zero 
4 1 a 1 
5 0 b 0 
6 1 b ONE 
7 0 b 0 
8 1 b ONE 

に基づいて行方向に値を持つベクトルを返す

# data 
dat <- data.frame(var1 = rep(c(0,1), 4), 
        var2 = c(rep("a", 4), rep("b", 4)) 
       ) 

# function 
my_fun <- function(x, y){ 
    z <- ifelse(y == "a", fun_a(x), fun_b(x)) 
    return(z) 
} 

fun_a <- function(x){ 
    z <- ifelse(x == 0, "zero", x) 
    return(z) 
} 

fun_b <- function(x){ 
    z <- ifelse(x == 1, "ONE", x) 
    return(z) 
} 
dat$var3 <- my_fun(dat$var1, dat$var2) 

例ですvar2が含まれていないデータセット。簡単な方法は、データセットに余分な列としてvar2を追加することですが、実際にはそうしたくありません。

これは私が文字列としてVAR2を供給するときに何が起こるかです:

other_dat <- data.frame(var1 = rep(c(0,1), 4)) 
other_dat$var3 <- my_fun(other_dat$var1, y = "a") 
other_dat 
    var1 var3 
1 0 zero 
2 1 zero 
3 0 zero 
4 1 zero 
5 0 zero 
6 1 zero 
7 0 zero 
8 1 zero 

それは文字列引数を受け入れ、私が望む結果を返すように、私はこの機能をvectoriseできますか?

答えて

1

yをベクトル化する、つまりyをxと同じ長さにすると、ifelseはすべての値に対して関数my_funcを適用します。改訂コード:

# data 
dat <- data.frame(var1 = rep(c(0,1), 4), 
        var2 = c(rep("a", 4), rep("b", 4)) 
       ) 

# function 
my_fun <- function(x, y){ 
    if(length(y) == 1) { 
    y <- rep(y, length(x)) 
    } 
    z <- ifelse(y == "a", fun_a(x), fun_b(x)) 
    return(z) 
} 

fun_a <- function(x){ 
    z <- ifelse(x == 0, "zero", x) 
    return(z) 
} 

fun_b <- function(x){ 
    z <- ifelse(x == 1, "ONE", x) 
    return(z) 
} 
dat$var3 <- my_fun(dat$var1, "a") 

other_dat <- data.frame(var1 = rep(c(0,1), 4)) 
other_dat$var3 <- my_fun(other_dat$var1, y = "a") 
other_dat 

希望します。

+0

コードを更新しました。 –

+0

完璧、ありがとう。それは私が見逃した素晴らしい解決策です。 –

関連する問題