2016-08-21 8 views
0

下記の私のデータ構造の例を作成しました。R - DataFrameを変換する

問題1:「日」は実際には$ startと$ endの差ですが、実際の測定日数は反映されていません。ですから、$ idの各IDについては、カウンタが必要です。その結果、id = 2の値は「4」ではなく「2」になります。

ソリューション

Count <- rle(sort(activity$id)) 
activity$count <- Count[[1]][match(activity$id, Count[[2]])] 

問題2:その後、私たちは持っていないすべての測定値が正確に測定の4日間は、削除する必要があります。この場合、id 2と4はそれぞれ2と3のデータポイントしか持たないので、id 1,3,5と6は生き残ります。

ソリューション

activity <- subset(activity, count== 30) 

問題3:私は$の状態で "完成" としてマークされている例をフィルタリングする必要があります。ここでは、すべての調整後にid 1,3および6のみが生き残ります。

Rはどのように見えるのですか?

id status energy sun start  end   days 
1 ok  10  10 01/05/16 01/09/16 4 
1 ok  20  20 01/05/16 01/09/16 4 
1 ok  30  30 01/05/16 01/09/16 4 
1 finished 40  40 01/05/16 01/09/16 4 
2 ok  0  5 12/06/15 12/10/15 4 
2 failed 0  5 12/06/15 12/10/15 4 
3 ok  10  5 12/26/15 12/30/15 4 
3 ok  20  10 12/26/15 12/30/15 4 
3 ok  30  15 12/26/15 12/30/15 4 
3 finished 40  20 12/26/15 12/30/15 4 
4 ok  10  0 07/09/15 07/12/15 3 
4 ok  15  10 07/09/15 07/12/15 3 
4 failed 5  10 07/09/15 07/12/15 3 
5 ok  10  5 11/16/15 11/20/15 4 
5 ok  12  10 11/16/15 11/20/15 4 
5 ok  18  15 11/16/15 11/20/15 4 
5 failed 20  20 11/16/15 11/20/15 4 
6 ok  10  20 12/31/15 01/04/16 4 
6 ok  20  30 12/31/15 01/04/16 4 
6 ok  30  35 12/31/15 01/04/16 4 
6 finished 40  45 12/31/15 01/04/16 4 
+4

複数の質問ではなく、1つの質問を1つだけ質問する方がよいでしょう。 – akrun

+1

あなたはこれまでに何を試しましたか? – agstudy

+0

私はソリューションに共通の機能があると思っていました。それは私がその1つの場合に固執する理由です。 – JohnnyDeer

答えて

1

ファクタ(場合によってはid)で分割されたデータフレームに関数を適用したいとします。 base Rでは、by()とそれに関連する関数tapply()が必要です。 dがあなたのデータであるとします。

d$days <- tapply(d$id, d$id, length)[d$id] 
d <- subset(d, days == 4) 
d <- do.call(rbind, 
    by(d, d$id, function(x) if ("finished" %in% x$status) x else NULL) 
) 
関連する問題