2017-07-12 11 views
0

私がやっていること:1つのデータフレームから列を取り出し、ifelseステートメントを使用してコードを再コードし、dplyrを使用して新しいデータフレームに移動します。それを一気に行うパイプ。複数のifelseステートメントとdplyrパイプ、2番目のオブジェクトを認識しない

問題:このコードは1列でうまく動作しますが、Rが同じ行のコードで複数の列に遭遇すると、問題が発生しています。 2番目の列は認識されず、Rはエラーをスローします。次のエラーが表示されます。

Error in mutate_impl(.data, dots) : Evaluation error: object 'var2_orig' not found.

これはどういう考えですか?また、ifelseステートメントを使用せずにこれに簡単な方法があるかもしれません。私はこのフロントの提案も受け付けていますが、ifelseでこれを行う方法と複数の列でエラーが発生する理由についてはまだ興味があります。どうもありがとう。

サンプルコード:

library(tidyverse) 

# creating fake data set 
df_orig <- data_frame(var1_orig = sample(1:3, 50, replace = T), 
        var2_orig = sample(-2:2, 50, replace = T)) 

# works for one var (recoding 3's as NA, 2's as 1, and 1's as 0): 

df_new <- df_orig %>% 
    as_tibble() %>% 
    transmute(var1_new = ifelse(var1_orig == 3, NA, ifelse(var1_orig == 
    2, 1, ifelse(var1_orig == 1, 0, var1_orig)))) 

# and works the other var (recoding negatives as NA, 1's and 2's as 1, and 
leaving 0's as 0's): 

df_new <- df_orig %>% 
    as_tibble() %>% 
    transmute(var2_new = ifelse(var2_orig < 0, NA, ifelse(var2_orig == 
    1 | var2_orig == 2, 1, 0))) 

# but not together in same line of code (error: var2_orig not recognized): 

df_new <- df_orig %>% 
    as_tibble() %>% 
    transmute(var1_new = ifelse(var1_orig == 3, NA, ifelse(var1_orig == 
    2, 1, ifelse(var1_orig == 1, 0, var1_orig)))) %>% 
    transmute(var2_new = ifelse(var2_orig < 0, NA, ifelse(var2_orig == 
    1 | var2_orig == 2, 1, 0))) 
+0

'それが作成されない変数をドロップtransmute'。 'mutate'を使用してください。 –

答えて

2

核変換エラーしたがって、変数をドロップします。そうvar2_orig存在していない、あなたは、既存の変数を更新するためにmutateを使用することができ、その後、rename_allは、(必要に応じて)自分の名前を変更するには、

df_orig %>% 
    as_tibble() %>% 
    mutate(var1_orig = ifelse(var1_orig == 3, NA, ifelse(var1_orig == 2, 1, 
                 ifelse(var1_orig == 1, 0, var1_orig))), 
      var2_orig = ifelse(var2_orig < 0, NA, ifelse(var2_orig == 1 | var2_orig == 2, 1, 0))) %>% 
    rename_all(funs(sub('_.*', '_new', .))) 
2

dplyrの動詞transmuteは、作成のみの変数を保持し、元varabilesをドロップもはや第2のtransmuteのために。

同じtransmuteコールで2つの変数を作成し、mutateを使用して、必要がない場合は元の変数を削除することができます。ところで

case_whenはここに有用であろう:

df_orig %>% 
    transmute(var1_new = case_when(var1_orig == 3 ~ NA_integer_, 
           var1_orig == 2 ~ 1L, 
           TRUE ~ var1_orig), 
     var2_new = case_when(var2_orig < 0 ~ NA_integer_, 
           var2_orig %in% 1:2 ~ 1L, 
           TRUE ~ 0L) 
) 
#> # A tibble: 50 x 2 
#> var1_new var2_new 
#>  <int> <int> 
#> 1  1  1 
#> 2  1  1 
#> 3  1  0 
#> 4  NA  NA 
#> 5  NA  0 
#> 6  1  NA 
#> 7  1  1 
#> 8  1  1 
#> 9  1  1 
#> 10  1  1 
#> # ... with 40 more rows 
+0

偉大な、私はcase_when関数に移動することを検討しているので、長期的には便利かもしれません。 –

関連する問題