2016-06-30 19 views
0

私は、列1(列は「日付」という列)の値と列2〜4の列(「A」 - >「C ")。各行について複数の列の値を比較し、比較結果に基づいて追加の列を設定する

2場合列のいずれかに3つの値のうち、A Iは、以下が含まれ、追加の第5列Dを作成する必要が


Date A B C 
1/1/16 X X Y 
1/2/16 X Y Y 
1/3/16 X Y Z 

etc. 

、BまたはC = Xの場合列Dの値X =

列A、BまたはC = Yのいずれかの値のうち2つが2の場合、value列D =列D = Z

所望の出力には何も他の値のY

に:


Date A B C D 
1/1/16 X X Y X 
1/2/16 X Y Y Y 
1/3/16 X Y Z Z 

私は値を比較するために、以前の推奨次のロジックを試みたが、していますそれは私にエラーの束を与える、明らかに "="記号はノーノです:

df$D <- NA 
df$D[df$A = df$B = X or df$B = df$C = X or df$A = df$C = Y] <- "X" 
df$D[df$A = df$B = Y or df$B = df$C = Y or df$A = df$C = Y] <- "Y" 
df$D[is.na(df$E)]    <- "Z" 

Error: unexpected '=' in "df$D[df$A ="

これを行うにはどうすればよいですか?

+0

使用 '=='比較のために。 – lmo

答えて

1

rowMeansを使用する方法は次のとおりです。

# assign all of D to "Z" 
df$D <- "Z" 
# replace values 
df$D[rowMeans(df[, 2:(length(df)-1)] == "X") > 0.5] <- "X" 
df$D[rowMeans(df[, 2:(length(df)-1)] == "Y") > 0.5] <- "Y" 

便利な機能は、変数を追加すると大きくなることです。

は、各行に対して、「X」を持つ要素の割合を計算します。あなたのしきい値(3のうち2)は0.666666 ...与えられた数の列には十分であるので、代わりに0.5を使用しました。追加の列が追加された場合は、これを2/3に近づけてください。

+0

代替ソリューションをありがとう! > 0.5のポイントは何ですか? –

+0

答えに追加のコメントを参照してください。 – lmo

+0

私はXとYの値を含む20の列を持っていて、3からの値にのみ関心があったなら、このwouldntの仕事はありますか?それは行全体の値を見て以来? –

0

として指摘されました===です。または|です。 Here's論理演算子へのリンク。

あり、よりよい解決策になるが、ここであなたがやりたいことのために正しい構文である可能性があります

df$D <- NA 
df$D[(df$A == "X" & df$B == "X") | (df$A == "X" & df$C == "X") | 
     (df$B == "X" & df$C == "X")] <- "X" 
df$D[(df$A == "Y" & df$B == "Y") | (df$A == "Y" & df$C == "Y") | 
     (df$B == "Y" & df$C == "Y")] <- "Y" 
df$D[is.na(df$D)] <- "Z" 
+0

正しい構文をありがとう、それは働いた! –

0

はifelse使用してみてください:

df$D<-ifelse(rowSums(df[,2:4]=='X')>=2,'X',ifelse(rowSums(df[,2:4]=='Y')>=2,'Y','Z'))