2016-06-29 6 views
0

列1(「日付」という列)および列2から5の値(「A」 - "D")。R:他の列からの入力に基づいて表内の列の条件付き設定


Date A B C D 
1/1/16 12 75 38 88 
1/2/16 32 76 44 34 


Iは、次のものが含まれ、追加の6列E作成する必要があります各行について

を:

場合列Aの値> B> C、列E = Xの値

列E = Z

で何か値の列E = Y

値の列に< B < Cの場合、値これを行うための最善の方法は何ですか?

+0

特にテストしたい条件のいずれも満たさないサンプルデータを提供するのはなぜですか? – thelatemail

+0

申し訳ありませんが、私はちょうどテーブル形式の例を挙げたいと思いました、実際の値は私が言及した規則に従わない。これをキャッチするためにありがとう! –

答えて

1
# Here I'm simulating your original dataset  
df <- data.frame(Date=seq(Sys.Date(),Sys.Date()+9,by=1), A = seq(1,20,2), 
       B = rep(10,1,1), C=abs(rnorm(10)), D = rnorm(10)) 
# Create E 
df$E <- NA 
df$E[df$A > df$B & df$B > df$C] <- "X" 
df$E[df$A < df$B & df$B < df$C] <- "Y" 
df$E[is.na(df$E)]    <- "Z" 
df 



     Date A B   C    D E 
1 2016-06-29 1 10 0.5833273005 -0.25244803522 Z 
2 2016-06-30 3 10 0.4291374487 0.01669504752 Z 
3 2016-07-01 5 10 1.7079045597 1.28413741595 Z 
4 2016-07-02 7 10 0.2286708311 1.16421926818 Z 
5 2016-07-03 9 10 0.6216853471 1.08934300378 Z 
6 2016-07-04 11 10 1.4662821456 -0.58322427720 X 
7 2016-07-05 13 10 0.8255102263 0.65217873906 X 
8 2016-07-06 15 10 1.6185672627 0.04195996408 X 
9 2016-07-07 17 10 0.6752993011 -2.31746231694 X 
10 2016-07-08 19 10 0.2901133125 0.97969860678 X 

# Create E only for a subset of rows, like 6:10 
df$E <- NA 
df$E[1:5] <- "nothing applied to this row" 
df$E[df$A > df$B & df$B > df$C & 6:10] <- "X" 
df$E[df$A < df$B & df$B < df$C & 6:10] <- "Y" 
df$E[is.na(df$E) & 6:10]    <- "Z" 
df 

     Date A B   C    D       E 
1 2016-06-29 1 10 0.5833273005 -0.25244803522 nothing applied to this row 
2 2016-06-30 3 10 0.4291374487 0.01669504752 nothing applied to this row 
3 2016-07-01 5 10 1.7079045597 1.28413741595 nothing applied to this row 
4 2016-07-02 7 10 0.2286708311 1.16421926818 nothing applied to this row 
5 2016-07-03 9 10 0.6216853471 1.08934300378 nothing applied to this row 
6 2016-07-04 11 10 1.4662821456 -0.58322427720       X 
7 2016-07-05 13 10 0.8255102263 0.65217873906       X 
8 2016-07-06 15 10 1.6185672627 0.04195996408       X 
9 2016-07-07 17 10 0.6752993011 -2.31746231694       X 
10 2016-07-08 19 10 0.2901133125 0.97969860678       X 
+1

ありがとうございます!私はこれを実装し、それは素晴らしい仕事をした!私は見たい行の数を減らすにはどうすればいいですか、私は6行から10行だけでこれをやりたいと言うことができます。もう一度おねがいします! –

+0

@ user3481603私の更新された説明を見てくださいが、Hack-Rの例を使って、 'df $ E [df $ A> df $ B&df $ B> df $ C&seq_along(df $ C)> = 6 )] ' – dcc310

+0

@ user3481603上記のHack-Rの回答から少し貼り付けた後、2番目のサブセットはB> Cとなります。C> Bと思ったときに、 ) – dcc310

1

私はこれが正常に動作すべきだと思う:

set.seed(1) 
myframe = data.frame(date=1:10, a=sample(1:10), b=sample(1:10),  c=sample(1:10), d=sample(1:10), e=NA) 
myframe[myframe$a > myframe$b & myframe$b > myframe$c, "e"] = "x" 
myframe[myframe$a < myframe$b & myframe$b < myframe$c, "e"] = "y" 
myframe[is.na(myframe$e), "e"] = "z" 
myframe 

x <- 1:41 2 3 4を与えるならば、x < - 1:4 < 3TRUE TRUE FALSE FALSEある

 
    date a b c d e 
1  1 3 3 10 5 z 
2  2 4 2 2 6 z 
3  3 5 6 6 4 z 
4  4 7 10 1 2 z 
5  5 2 5 9 10 y 
6  6 8 7 8 8 z 
7  7 9 8 7 9 x 
8  8 6 4 5 1 z 
9  9 10 1 3 7 z 
10 10 1 9 4 3 z 

を与えます。従って、someFrame[x, "someCol"]は、xがTRUEである行、すなわち第1行と第2行からその列を選択する。ベクトルの場合も同じですので、c("a", "b", "c", "d")[x]a bを返します。私はそれが価値があるため、これを「論理インデックス作成」と呼んでいると聞いてきました。

+0

ありがとうございます!なぜ私が聞くかもしれないset.seedコマンドを使用しますか? –

+0

また、テーブルの行数を減らす簡単な方法は、私は行6で10行だけでlopkしたいと言うことができます。 –

+0

@ user3481603、6以上に制限する方法については、Hack-Rの答えに対する私のコメントを参照してください。 set.seed関数は、ランダム性を含むサンプルを他のものに再現可能にすることです。そうしないと、毎回異なる "ランダム"な結果が得られます。 – dcc310

関連する問題