dplyr パッケージは条件付き変更に使用できますか? 質問する

dplyr パッケージは条件付き変更に使用できますか? 質問する

ミューテーションが条件付きの場合(特定の列の値に応じて)に、mutate を使用できますか?

この例は私が何を言いたいのかを示すのに役立ちます。

structure(list(a = c(1, 3, 4, 6, 3, 2, 5, 1), b = c(1, 3, 4, 
2, 6, 7, 2, 6), c = c(6, 3, 6, 5, 3, 6, 5, 3), d = c(6, 2, 4, 
5, 3, 7, 2, 6), e = c(1, 2, 4, 5, 6, 7, 6, 3), f = c(2, 3, 4, 
2, 2, 7, 5, 2)), .Names = c("a", "b", "c", "d", "e", "f"), row.names = c(NA, 
8L), class = "data.frame")

  a b c d e f
1 1 1 6 6 1 2
2 3 3 3 2 2 3
3 4 4 6 4 4 4
4 6 2 5 5 5 2
5 3 6 3 3 6 2
6 2 7 6 7 7 7
7 5 2 5 2 6 5
8 1 6 3 6 3 2

私は、新しい列 g を作成するために、dplyr パッケージ (これは動作するはずのコードではないことは承知していますが、目的は明らかだと思います) を使用して問題の解決策を見つけたいと考えていました。

 library(dplyr)
 df <- mutate(df,
         if (a == 2 | a == 5 | a == 7 | (a == 1 & b == 4)){g = 2},
         if (a == 0 | a == 1 | a == 4 | a == 3 |  c == 4) {g = 3})

私が探しているコードの結果は、この特定の例では次のようになるはずです。

  a b c d e f  g
1 1 1 6 6 1 2  3
2 3 3 3 2 2 3  3
3 4 4 6 4 4 4  3
4 6 2 5 5 5 2 NA
5 3 6 3 3 6 2 NA
6 2 7 6 7 7 7  2
7 5 2 5 2 6 5  2
8 1 6 3 6 3 2  3

dplyr でこれを行う方法について、誰かアイデアをお持ちですか? このデータ フレームは単なる例です。私が扱っているデータ フレームはもっと大きいです。速度が速いため、dplyr を使用しようとしましたが、おそらくこの問題を処理する他のより良い方法があるのではないでしょうか?

ベストアンサー1

使用ifelse

df %>%
  mutate(g = ifelse(a == 2 | a == 5 | a == 7 | (a == 1 & b == 4), 2,
               ifelse(a == 0 | a == 1 | a == 4 | a == 3 |  c == 4, 3, NA)))

追加 - if_else: dplyr 0.5 ではif_else関数が定義されているため、代わりifelseに を に置き換えることができます。ただし、 はよりも厳密であるため(条件の両方の脚は同じ型である必要があります)、その場合は を に置き換える必要があることif_elseに注意してください。if_elseifelseNANA_real_

df %>%
  mutate(g = if_else(a == 2 | a == 5 | a == 7 | (a == 1 & b == 4), 2,
               if_else(a == 0 | a == 1 | a == 4 | a == 3 |  c == 4, 3, NA_real_)))

追加 - case_whenこの質問が投稿されてから dplyr が追加したのでcase_when、別の代替案は次のようになります。

df %>% mutate(g = case_when(a == 2 | a == 5 | a == 7 | (a == 1 & b == 4) ~ 2,
                            a == 0 | a == 1 | a == 4 | a == 3 |  c == 4 ~ 3,
                            TRUE ~ NA_real_))

追加 - arithmetic/na_if値が数値で条件 (末尾のデフォルト値 NA を除く) が相互に排他的である場合 (質問の場合と同様)、na_if末尾の を使用して各項に目的の結果を乗算し、0 を NA に置き換える算術式を使用できます。

df %>%
  mutate(g = 2 * (a == 2 | a == 5 | a == 7 | (a == 1 & b == 4)) +
             3 * (a == 0 | a == 1 | a == 4 | a == 3 |  c == 4),
         g = na_if(g, 0))

おすすめ記事