2016-10-28 6 views
-3

final datasetデータセットが添付されています。idで0の最後のn行を削除し、最後にidで最後のn個の要素を削除します。

私はIdで
バイナリ内のすべての最後の0を削除し、idで 用テール3を選択します。 (注:Id 2の場合のみ、2
w5およびw6)。最終的なデータセットのようになります。

効率的な方法はありますか?

+1

私はあなたが – rawr

+0

あなたの質問をフォーマットしてください?私が見るFinalとOriginalのデータセットの唯一の違いは、Finalにすべての末尾のゼロが削除されていることです。 – useR

+0

を求めている。これは良いですが、あなたは「idで用テール3を選択する」とはどういう意味ですか何見当がつかない – useR

答えて

0

どうやってこのようになりますか?

ID = c(rep(1, 8), rep(2, 4), rep(3, 8)) 
week = c(2:9, 5:8, 13:20) 
binary = c(0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0) 

dataset = data.frame(ID, week, binary) 

> dataset 
    ID week binary 
1 1 2  0 
2 1 3  1 
3 1 4  1 
4 1 5  1 
5 1 6  1 
6 1 7  0 
7 1 8  0 
8 1 9  0 
9 2 5  1 
10 2 6  1 
11 2 7  0 
12 2 8  0 
13 3 13  1 
14 3 14  1 
15 3 15  1 
16 3 16  0 
17 3 17  0 
18 3 18  1 
19 3 19  0 
20 3 20  0 

ソリューション:

# Split dataset by ID 
byGroupDf = split(dataset, ID) 

# For each grouped dataset, take only rows up till the last row where ID not equal to 0 
byGroupFinal = lapply(byGroupDf, function(x) tail(x[1:max(which(x$binary != 0)),], 3)) 

# Combine the grouped datasets 
FinalDf = do.call(rbind, byGroupFinal) 

> FinalDf 
    ID week binary 
1.3 1 4  1 
1.4 1 5  1 
1.5 1 6  1 
2.9 2 5  1 
2.10 2 6  1 
3.16 3 16  0 
3.17 3 17  0 
3.18 3 18  1 
+1

私は最終的なデータセットに適切なものを添付しました。 byGroupFinal = lapply(byGroupDf、function(x)tail(x [1:max(which $ x binary!= 0))、]、3))。あなたのコードにtail 3を追加するだけで、私が望むものを得ることができます。ありがとう – MLM

+0

@MLM私の答えを編集しました。これは、あなたの望むことですか? – useR

関連する問題