Граф напоминает из времени данные - PullRequest
0 голосов
/ 28 июля 2011

У меня есть фрейм данных, содержащий следующую информацию:

ID    ATTRIBUTE    START    END

Я хочу посчитать количество возвратов за ID.Отзыв происходит, если

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

, где (-i) := (j != i)

Можете ли вы мне помочь?

Спасибо!

Извините, что не предоставил данные ранее -Вот некоторые из них:

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

(сделал это вручную - надеюсь, ошибок нет)

Ответы [ 2 ]

2 голосов
/ 28 июля 2011

Использование == и <= не имеет особого смысла, поскольку значение слева - это одно значение, а значение справа - вектор. Я предполагаю, что вам нужно проверить, соответствует ли ID любому другому ID. Для этого вы можете использовать

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

Для того, чтобы сохранить цикл, я советую выбрать дубликаты ID с функцией duplicate. Например,

bad_ID <- duplicated(your_data$ID)

Логика еще более неоднозначна для третьего условия. Я (дико) предполагаю, что вы хотите, чтобы значение END было меньше, чем все другие значения START минус 100.

Нам придется выполнить цикл для этого условия.

Тогда полная логика

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)
  ))
}
2 голосов
/ 28 июля 2011

Что-то в этом роде.Не проверено в отсутствие примеров данных:

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) ) )

После редактирования вопроса я все еще думаю, что может быть потенциал для кода выше, если аргумент dataframe сначала сортируется по START в ID и ATTRIBUTE:

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) ) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...