3

他の列のいくつかの条件に基づいてデータフレームに新しい列を追加しようとしています。以下の3つの条件が満たされた場合複数の列から複数の条件に基づいて新しい列を作成する方法を教えてください。

> commute <- c("walk", "bike", "subway", "drive", "ferry", "walk", "bike", "subway", "drive", "ferry", "walk", "bike", "subway", "drive", "ferry") 
> kids <- c("Yes", "Yes", "No", "No", "Yes", "Yes", "No", "No", "Yes", "Yes", "No", "No", "Yes", "No", "Yes") 
> distance <- c(1, 12, 5, 25, 7, 2, "", 8, 19, 7, "", 4, 16, 12, 7) 
> 
> df = data.frame(commute, kids, distance) 
> df 
    commute kids distance 
1  walk Yes  1 
2  bike Yes  12 
3 subway No  5 
4 drive No  25 
5 ferry Yes  7 
6  walk Yes  2 
7  bike No   
8 subway No  8 
9 drive Yes  19 
10 ferry Yes  7 
11 walk No   
12 bike No  4 
13 subway Yes  16 
14 drive No  12 
15 ferry Yes  7 

:私は、次のようなデータを持っている

commute = walk OR bike OR subway OR ferry 
AND 
kids = Yes 
AND 
distance is less than 10 

それから私は「はい」と等しくなるようにget.flyerと呼ばれる新しい列をしたいと思います。最終的なデータフレームは次のようになります。

commute kids distance get.flyer 
1  walk Yes  1  Yes 
2  bike Yes  12  Yes 
3 subway No  5   
4 drive No  25   
5 ferry Yes  7  Yes 
6  walk Yes  2  Yes 
7  bike No     
8 subway No  8   
9 drive Yes  19   
10 ferry Yes  7  Yes 
11 walk No     
12 bike No  4   
13 subway Yes  16  Yes 
14 drive No  12   
15 ferry Yes  7  Yes 
+0

ためfactorを使用することができます(http://stackoverflow.com/questions/5963269 [この]従ってみてください/ how-to-make-a-great-r-reproducible-example/38523589#38523589) – user2100721

答えて

6

を我々は両方の条件に該当するかどうかを確認するための列の複数の要素を比較するための%in%&を使用することができます。

library(dplyr) 
df %>% 
    mutate(get.flyer = c("", "Yes")[(commute %in% c("walk", "bike", "subway", "ferry") & 
      as.character(kids) == "Yes" & 
      as.numeric(as.character(distance)) < 10)+1]) 

それはTRUEで、デフォルトでように、stringsAsFactors=FALSEdata.frameを作成することをお勧めします。 str(df)をチェックすると、すべての列がfactorクラスであることがわかります。また、値がない場合は""の代わりにNAを使用して、numeric列のclassを別のものに変換しないようにすることができます。

我々は 'DF'

distance <- c(1, 12, 5, 25, 7, 2, NA, 8, 19, 7, NA, 4, 16, 12, 7) 
df1 <- data.frame(commute, kids, distance, stringsAsFactors=FALSE) 

上記のコードの作成を書き換える場合より良く理解するために

df1 %>% 
    mutate(get.flyer = c("", "Yes")[(commute %in% c("walk", "bike", "subway", "ferry") & 
     kids == "Yes" & 
     distance < 10)+1]) 

を簡略化することができ、一部の人々はifelse

df1 %>% 
    mutate(get.flyer = ifelse(commute %in% c("walk", "bike", "subway", "ferry") & 
       kids == "Yes" & 
       distance < 10, 
          "Yes", "")) 

この缶を好みますbase Rの方法でも簡単に行うことができます

df1$get.flyer <- with(df1, ifelse(commute %in% c("walk", "bike", "subway", "ferry") & 
       kids == "Yes" & 
       distance < 10, 
         "Yes", "")) 
6

解決策はすでに@akrunによって指摘されています。私はそれをより包括的な方法で提示したいと思います。

ifelseステートメントを使用して、1つ(または複数)の条件に基づいて列を作成できます。しかし、まず、距離の列の欠損値の「コード化」を変更する必要があります。欠損値を示すには""を使用しましたが、これは列全体をstringに変換し、数値比較を禁止します(distance < 10は不可)。欠損値を示すのR方法はNAで、distanceのあなたの列の定義は次のようになります。

distance <- c(1, 12, 5, 25, 7, 2, NA, 8, 19, 7, NA, 4, 16, 12, 7) 

ifelse文はその後、次のようになります。

df$get.flyer <- ifelse(
    ( 
     (df$commute %in% c("walk", "bike", "subway", "ferry")) & 
     (df$kids == "Yes")          & 
     (df$distance < 10) 
    ), 
    1, # if condition is met, put 1 
    0 # else put 0 
) 

オプション:あなたの他の列をコード考えてみましょう別の方法でも使用できます。

  • TRUEFALSE代わりに「はい」のおよび「いいえ」変数kids
  • ためのあなたは通勤
関連する問題