2016-08-25 1 views
-1

私はこのようになります「N」の行とRでのデータフレームがあります。私の考えはスキップされますR(及び「NEXT」「IF」おそらく含む)でループを記述であるデータフレーム列の行をスキップするには、Rの「IF」と「NEXT」を使用する方法は?

enter image description here

を例えば、ID1の場合、4行目(値= 1)までしか保存せず、残りの(値= 0)をスキップします。その後、2番目の行(値= 1)まで保存し、他のすべてをスキップしてID2に移動して、最初の(値= 1)だけを保存し、他をスキップしてID3に移動するID10に移動します等々。私はそれを達成する方法上の任意のアイデア

enter image description here

現在、私はこのループのようなものがありますか?

ありがとう、バンチ、 ディエゴ。

+1

画像を投稿しないで、代わりに 'dput'を使用して例を表示してください。予想される出力も表示できますか? – akrun

+1

@akrun - あまりにも奇妙なカットアンドペーストエラーが発生しているので、SOのコメントからコードを取ります。非印字スペース文字...奇妙です。 – thelatemail

答えて

1

data.tableを使用できます。 'data.frame'を 'IDs'でグループ化された 'data.table'(setDT(df1))に変換し、 'value'(which.max)の最初の最大値のインデックスを取得し、そのシーケンスを見つけます最初の1として5、次に1:5になります)、行インデックスを取得するために.Iでラップし、列($V1)を抽出し、データセットのサブセットにします。

library(data.table) 
setDT(df1)[df1[, .I[seq(which.max(value))], by = IDS]$V1] 

特定の「ID」に「値」が0のみ含まれているかどうかは不明です。私たちは、「IDが」、我々は今、プロセス

setDT(df1) #converts the `data.frame` to `data.table` 

を分割することができ、我々が得るためのプロセスを行うことができます構文を理解するためにif条件

setDT(df1)[df1[, if(any(value!=0)) .I[seq(which.max(value))], by = IDs]$V1] 

を使用することをスキップする必要がある場合ROWID。以下のコードでは、 'ID'でグループ化し、最初の要素のインデックスを 'value'(which.max(value))にしてから、シーケンス(seq(...))を実行し、データセット全体(.I[...]) 。列「のID」とデータセットと行インデックスのデフォルトの列「V1」は上記

df1[, .I[seq(which.max(value))] , by = IDs] 

(我々は、列名を指定しなかったように)、我々は、その列、使用を抽出している場合$V1又は[["V1"]]

i1 <- df1[, .I[seq(which.max(value))] , by = IDs]$V1 

行インデックス( 'I1')の目的は、初期のデータセットの行をサブセットするために使用される

df1[i1] 
+0

こんにちは!まず、すぐにお返事いただきありがとうございます。第二に、IDが0でないので、ここではうまくいきます。しかし、あなたのソリューションでは、forループを使う必要はありませんか?第二に、私はまだあなたが「列($ V1)を抽出し、データセットをサブセット化する」という意味を持っていません。 私はあなたが見ることができるように2つの列(IDSと値)と25の行を持っています。私の場合、$ V1は何ですか?サブセッティングはどのように行われますか? –

+0

@DiegoMenezes私はいくつかの説明で投稿を更新しました。はい、あなたは 'for'ループを使う必要はなく、非常に効率的です。ソリューションには抽出部分が説明されています。 – akrun

+0

@DiegoMenezes動作する場合は、投票の横にあるチェックマークをクリックして解決策を受け入れることを検討してください。 – akrun

関連する問題