2011-07-28 25 views
0

からリコール私は、以下の情報を含むデータフレームを持っている:カウント時間データ

ID ATTRIBUTE START END 

は私がIDあたりのリコールをカウントします。 (-i) := (j != i)

は、あなたが私を助けることができる

ID.i == ID.(-i) 
ATTRIBUTE.i == ATTRIBUTE.(-i) 
END.i <= START.(-i) - 100 

場合、リコールが発生しますか?

ありがとうございました!

以前のデータを提供していないため申し訳ありません - ここにいくつかです:

ID ATTRIBUTE START  END 
1  10   2000-01-01 2000-01-30 
1  10   2000-03-01 2000-04-30 
2  20   2000-01-01 2000-01-30 
2  21   2000-03-01 2000-04-30 
3  30   2000-01-01 2000-01-30 
3  30   2001-01-01 2000-01-30 
4  40   2000-01-01 2000-01-30 
4  40   2000-03-01 2000-04-30 
4  50   2000-06-01 2000-06-30 
4  40   2000-07-01 2000-10-30 
4  40   2001-01-01 2001-01-30 

ID ATTRIBUTE START  END   COUNT 
1  10   2000-01-01 2000-01-30 2 
1  10   2000-03-01 2000-04-30 2 
2  20   2000-01-01 2000-01-30 1 
2  21   2000-03-01 2000-04-30 1 
3  30   2000-01-01 2000-01-30 1 
3  30   2001-01-01 2000-01-30 1 
4  40   2000-01-01 2000-01-30 4 
4  40   2000-03-01 2000-04-30 4 
4  41   2000-06-01 2000-06-30 1 
4  40   2000-07-01 2000-10-30 4 
4  40   2001-01-01 2001-01-30 4 

につながるはずは(手でそれをやった - 間違いがない願っています)に沿って

+1

あると'あなたは、行の比較を.2'を意味しています。私。 'ID' *と*' ATTRIBUTE'が**と**の間にENDとそれに続くSTARTとの差が100より小さい場合、隣接する行については? –

+0

あなたの答えに感謝します。私は必ず2 = i + 1を意味するのではなく、他の行だけを意味する。これを-i表記で修正します – speendo

+1

テストのためのサンプルデータを待っています。 –

答えて

2

何かをこれらの行。

aggregate(df[ order(df$ID, DF$ATTRIBUTE, df$START), ] 
     df$ID, df$ATTRIBUTE, 
     FUN= function(x) sum(sapply(1:(nrow(x)-1), 
           function(n)x$END[n] <= x$START[n+1] -100))) 
:私はまだ引数のデータフレームが最初にIDとATTRIBUTE内STARTによってソートされている場合、上記のコードの可能性がかもしれないと思う質問を編集した後

aggregate(df, df$ID, df$ATTRIBUTE, 
     FUN= function(x) sum(sapply(1:(nrow(x)-1), 
           function(n)x$END[n] <= x$START[n+1] -100))) 

:サンプルデータの不存在下でテストされていません

2

==<=の使用はあまり意味がありません。なぜなら、左側の値は単一の値ですが、右側の値はベクトルですからです。あなたが望むのは、IDが他のどれと一致するかをテストすることです。ID。このために、あなたはあなたががループを保存するには

with(your_data, ID[i] %in% ID[-i]) 

を使用することができ、私はduplicate機能と重複IDのを拾ってお勧めします。例えば、

bad_ID <- duplicated(your_data$ID) 

ロジックは、3番目の条件でさらに曖昧です。私は(激しく)ENDの値がSTARTから100を引いた値より小さいことを推測しています。

この条件でループする必要があります。

私は '1'を+ `でi``完全な論理が `によって.1`その後、

is_recall <- function(data) 
{ 
    bad_ID <- duplicated(your_data$ID) 
    bad_attr <- duplicated(your_data$ATTRIBUTE) 
    bad_end <- with(your_data, sapply(
    seq_len(nrow(your_data)), 
    function(i) END[i] < min(START[-i] - 100) 
)) 
} 
+0

免責事項:データは提供されておらず、問題のロジックはあいまいであるため、ナンセンスの可能性が高いです。 –

関連する問題