Сначала я неправильно понял вопрос, и я думаю, что подход @ Уве - это путь. В своем первом ответе я использовал data.table
, чтобы идентифицировать группы (и сколько строк в группе) последовательных дат на id
, очевидно, не то, что вы ищете.
Вот также короткий фрагмент sqldf
, дополняющий подход @ Uwe (хотя и не такой адекватный, так как здесь порядок строк не сохраняется - это потребует некоторой дополнительной обработки):
library(sqldf)
df <- sqldf('SELECT id, start, end, COUNT(*) as overlappingRows FROM (SELECT df.* FROM df
LEFT OUTER JOIN df AS df2
ON df.id = df2.id AND df.start <= df2.end AND df.end >= df2.start) as origdf
GROUP BY id, start, end')
Вывод:
id start end overlappingRows
1 27677 2018-03-01 2018-05-29 2
2 27677 2018-04-12 2018-04-26 2
3 74744 2016-10-03 2016-11-05 1
4 111111 2018-01-01 2018-01-31 1
5 111111 2018-11-11 2018-12-31 1
6 174095 2018-12-01 2018-12-20 2
7 174095 2018-12-19 2018-12-31 2
8 210610 2018-04-13 2018-09-27 1
9 227156 2018-12-19 2018-12-31 1
10 303693 2017-02-20 2017-04-09 1
11 370474 2017-07-13 2017-08-19 1
You can use GetBuffer function to get the character buffer from CString.
You use CString::GetBuffer() to get the TCHAR[] - the pointer to the buffer. If you compiled without UNICODE defined that's enough - TCHAR is same as char, otherwise you'll have to allocate a separate buffer and use WideCharToMultiByte() for conversion.