У меня есть данные, отформатированные как
PERSON_A PERSON_B MEET LEAVE
Это описывает, в основном, когда PERSON_A встретил PERSON_B во время MEET, и они сказали "пока" друг другу в момент LEAVE. Время выражается в секундах, и небольшая часть данных находится на http://pastie.org/2825794 (simple.dat).
Мне нужно подсчитать количество собраний, группирующих его по дням . На данный момент у меня есть код, который работает, внешний вид не красивый. В любом случае, мне нужна помощь, чтобы преобразовать ее в код, который отражает группировку, которую я пытаюсь выполнить, например, используя ddply и т. Д. Поэтому моя главная цель - извлечь уроки из этого случая. Вероятно, в этом коде много ошибок относительно хороших практик в R.
library(plyr)
data = read.table("simple.dat", stringsAsFactors=FALSE)
names(data)=c('PERSON_A','PERSON_B','MEET','LEAVE')
attach(data)
min_interval = min(MEET)
max_interval = max(LEAVE)
interval = max_interval - min_interval
day = 86400
number_of_days = floor(interval/day)
g = data.frame(MEETINGS=c(0:number_of_days)) # just to store the result
g[,1] = 0
start_offset = min_interval # start of the first day
for (interval in c(0:number_of_days)) {
end_offset = start_offset + day
meetings = (length(data[data$MEET >= start_offset & data$LEAVE <= end_offset, ]$PERSON_A) + length(data[data$MEET >= start_offset & data$LEAVE <= end_offset, ]$PERSON_B))
g[interval+1, ] = meetings
start_offset = end_offset # start next day
}
g
Этот код выполняет итерации по дням (интервалы 86400 секунд) и сохраняет количество собраний в кадре данных g. Правильный вывод (показан ниже) этого кода при выполнении в связанном наборе данных дает для каждой строки (дня) количество встреч.
MEETINGS
1 38
2 10
3 16
4 18
5 24
6 6
7 4
8 10
9 28
10 14
11 22
12 2
13 .. 44 0 # I simplified the output here
45 2
В любом случае, я знаю, что могу использовать ddply, чтобы получить количество собраний для каждой пары o узлов:
contacts <- ddply(data, .(PERSON_A, PERSON_B), summarise
, CONTACTS = length(c(PERSON_A, PERSON_B)) /2
)
но между этим и результатом, который мне нужен, есть огромный холм для меня.
В качестве заключительного замечания я прочитал Как сделать отличный воспроизводимый пример с R? и постарался изо всех сил:)
Спасибо