R - R

2017-04-21 6 views
0
date  A B C 
11/24/2016 0 -1 -1 
11/23/2016 -1 -1 -1 
11/22/2016 0 -1 -1 
11/21/2016 0 -1 -1 
11/18/2016 -1 -1 -1 
11/17/2016 -1 -1 -1 
11/16/2016 -1 -1 -1 
11/15/2016 -1 -1 -1 
11/14/2016 -1 -1 -1 
11/11/2016 -1 -1 -1 
11/10/2016 0 -1 0 
11/9/2016 0 -1 0 

ExcelのコマンドにExcelからIFを複製()論理コマンドC=IF(A2=-1, -1, IF(AND(B2=-1,C3=-1),-1,0))あるため(データを想定はROW2で始まります)。したがって、基本的に、列Aが-1の場合、列Cも-1になります。それ以外の場合は、B2=-1か、Cの下の行が-1かどうかを確認します。 Excelでは、私は単に式をコピー/貼り付けすることでこれを行うことができました。そして、C列は自動的に自動的に更新されます。R - R

Rで私はcol ABの値を持っています。これらの列を使って、Excelでのやり方のようにCを作成したいと思います。しかし、私はかなりの時間これを行う方法について考えて立ち往生してきました。これは 'C'が 'A'に依存し、失敗した場合は 'B'とそれ自身の遅れた値に依存するためです。助けていただければ幸いです!

編集:私はおそらく動作する可能性があることを念頭に置いています。最初のループを実行した後

for (i in 1:length(dat[,1])){ 

     dat[i,3] <- ifelse(dat[i,1]==-1, -1, 0) 

     } 

、私が取得:

第二の条件のために今
A B V3 
1 0 -1 0 
2 -1 -1 -1 
3 0 -1 0 
4 0 -1 0 
5 -1 -1 -1 
6 -1 -1 -1 
7 -1 -1 -1 
8 -1 -1 -1 
9 -1 -1 -1 
10 -1 -1 -1 
11 0 -1 0 
12 0 -1 0 

for (i in 2:length(dat[,1])){ 

     dat[i-1,3] <- ifelse(dat[i-1,2]==-1&dat[i,3]==-1, -1, dat[i,3]) 

     } 

第二の条件のために、私はfor()がチェックすることを願っていますその前の行は、-1を繰り返し入力します.Cの現在の行の前に行の中に-1があって、-1しかし、これは戻っBの現在の行の1を終わる:

A B V3 
1 0 -1 -1 
2 -1 -1 0 
3 0 -1 0 
4 0 -1 -1 
5 -1 -1 -1 
6 -1 -1 -1 
7 -1 -1 -1 
8 -1 -1 -1 
9 -1 -1 -1 
10 -1 -1 0 
11 0 -1 0 
12 0 -1 0 

を私はrow3が-1として埋め得ることができるように、-1として滞在するrow2を必要としています。

+2

既に 'C'列の値が設定されていますか? –

+0

@Ronak Shah申し訳ありません!明らかにしておくべきである。私はRで 'A'と' B'の値を持っています。Excelでどうやって行ったのかのように 'C'を作るためにそれらを使いたいと思います。私の投稿を編集します! – Nikitau

+0

'dplyr :: case_when'はそれを文字どおり処理します:' library(dplyr); (C == -1、-1 = -1〜-1、TRUE〜0)) 'そうでなければ、ネスト' ifelse '呼び出しが、それは乱雑になる。 – alistaire

答えて

0

あなたはRで 'ifelse' 関数を使用することができます。

x<-data.set.name 
y<-ifelse(x$A==-1,-1,ifelse(x$B==-1 & X$C==-1,-1,0)) 

これはそれを行う必要があります。

+1

次の行から 'C'の値を取得する必要があります。 – alistaire

+0

こんにちは、私はそれが 'リード'または 'ラグ' Cかもしれないと思いますか?また、問題はExcelで 'C'が実際には生成されていないということです.Excelでは、式をコピー/ペーストでき、' C'列が自動的に更新されました。私はこれがRでどのように動作するのかよく分かりません。 – Nikitau

+0

@alistaire Yup。そして問題を複雑にするために、何とかRで 'C'を生成しなければなりません。 – Nikitau

1

問題は、計算している値から次の値を引き出しているため、下から計算を開始する必要があります。その値は上端までカスケードする可能性があるからです。 right = TRUEaccumulate = TRUEReduceは、ロジックを作成することができます

df$C <- sapply(
    Reduce(
     function(x, y){ 
      if (x[[1]] == -1) { -1 } else if (x[[2]] == -1 & y[[1]] == -1) { -1 } else { 0 } 
     }, 
     Map(c, df$A, df$B), right = TRUE, accumulate = TRUE), 
    `[`, 1) 

df 
#>   date A B C 
#> 1 11/24/2016 0 -1 -1 
#> 2 11/23/2016 -1 -1 -1 
#> 3 11/22/2016 0 -1 -1 
#> 4 11/21/2016 0 -1 -1 
#> 5 11/18/2016 -1 -1 -1 
#> 6 11/17/2016 -1 -1 -1 
#> 7 11/16/2016 -1 -1 -1 
#> 8 11/15/2016 -1 -1 -1 
#> 9 11/14/2016 -1 -1 -1 
#> 10 11/11/2016 -1 -1 -1 
#> 11 11/10/2016 0 -1 0 
#> 12 11/9/2016 0 -1 0 

、それはすべての行に対して反復処理を実行することがあるので、それはひどく速くなりませんが、1K行の罰金になります。

ここでの論理は疑わしいものであり、計算するものが意味をなさないかどうかを慎重に考慮する必要があります。

+0

ありがとう!私は「Reduce」がこれを行うことができることに気づいていませんでした。私は、データのリストである私の元のデータのためにこれを書き換えるのが少し難しいです。フレーム。私の元のサンプルデータが、すべての列を返すための私のdata.frames(df [[1]]、そしてC列を取得するためのdf [[1]] [、3]のうちの1つだった場合、 ? – Nikitau

+0

'lapply'の中のリスト全体にすべてのものをマップすることもできますし、data.frameがまったく同じであれば、それらを元にしたID列を持つ大きなdata.frameにバインドすることができます(' dplyr :: bind_rows'の '.id'パラメータセットはこれを簡単にします)、グループごとに適用します。リストを扱うためのユーティリティがたくさんある 'purr'も見ることができます。 – alistaire