106

4 つの列を持つ大きなデータフレーム ("myfile") では、最初の 4 つの列に基づいて条件付きで値を持つ 5 番目の列を追加する必要があります。

主に大規模なデータセットでの速度のため、dplyrとの回答を優先します。mutate

私のデータフレームは次のようになります。

  V1 V2 V3 V4
1  1  2  3  5
2  2  4  4  1
3  1  4  1  1
4  4  5  1  3
5  5  5  5  4
...

5 番目の列 (V5) の値は、いくつかの条件付きルールに基づいています。

if (V1==1 & V2!=4) {
  V5 <- 1
} else if (V2==4 & V3!=1) {
  V5 <- 2
} else {
  V5 <- 0
}

mutateここで、関数を使用して、すべての行でこれらのルールを使用したいと考えています (低速ループを回避するため)。このようなもの (そして、はい、この方法では機能しないことはわかっています!):

myfile <- mutate(myfile, if (V1==1 & V2!=4){V5 = 1}
    else if (V2==4 & V3!=1){V5 = 2}
    else {V5 = 0})

これは結果になるはずです:

  V1 V2 V3 V4 V5
1  1  2  3  5  1
2  2  4  4  1  2
3  1  4  1  1  0
4  4  5  1  3  0
5  5  5  5  4  0

でこれを行う方法はdplyr

4

3 に答える 3

128

これを試して:

myfile %>% mutate(V5 = (V1 == 1 & V2 != 4) + 2 * (V2 == 4 & V3 != 1))

与える:

  V1 V2 V3 V4 V5
1  1  2  3  5  1
2  2  4  4  1  2
3  1  4  1  1  0
4  4  5  1  3  0
5  5  5  5  4  0

またはこれ:

myfile %>% mutate(V5 = ifelse(V1 == 1 & V2 != 4, 1, ifelse(V2 == 4 & V3 != 1, 2, 0)))

与える:

  V1 V2 V3 V4 V5
1  1  2  3  5  1
2  2  4  4  1  2
3  1  4  1  1  0
4  4  5  1  3  0
5  5  5  5  4  0

ノート

データ フレームにもっと適切な名前を付けることをお勧めします。myfile は、ファイル名を保持しているかのように見せます。

上記では、次の入力を使用しました。

myfile <- 
structure(list(V1 = c(1L, 2L, 1L, 4L, 5L), V2 = c(2L, 4L, 4L, 
5L, 5L), V3 = c(3L, 4L, 1L, 1L, 5L), V4 = c(5L, 1L, 1L, 3L, 4L
)), .Names = c("V1", "V2", "V3", "V4"), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5"))

更新 1 最初に投稿された dplyr が変更さ%.%れた%>%ため、それに応じて回答が変更されました。

Update 2 dplyrcase_whenには、別のソリューションを提供するものがあります。

myfile %>% 
       mutate(V5 = case_when(V1 == 1 & V2 != 4 ~ 1, 
                             V2 == 4 & V3 != 1 ~ 2,
                             TRUE ~ 0))
于 2014-03-11T21:52:53.477 に答える
12

パッケージderivedFactorからしmosaicてこのためにデザインされたようです。この例では、次のようになります。

library(mosaic)
myfile <- mutate(myfile, V5 = derivedFactor(
    "1" = (V1==1 & V2!=4),
    "2" = (V2==4 & V3!=1),
    .method = "first",
    .default = 0
    ))

(結果を係数ではなく数値にしたい場合は、 を で囲みますderivedFactoras.numeric)

.defaultオプションを と組み合わせると.method = "first"、"else" 条件が設定されることに注意してください。この方法については、 のヘルプ ファイルに説明がありますderivedFactor

于 2015-10-22T20:14:44.507 に答える