Группировка переменных R на основе подгрупп

У меня есть данные в формате

PERSON_A PERSON_B MEET LEAVE

В основном это описывает, когда ЛИЦО_А встретил ЛИЦО_Б во время ВСТРЕЧИ, и они сказали друг другу «до свидания» в момент ВЫЙТИ. Время выражено в секундах, и небольшая часть данных находится на http://pastie.org/2825794 (простой.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. Правильный вывод (показан ниже) этого кода при выполнении в связанном наборе данных дает для каждой строки (дня) количество o встреч.

       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 для получения количества встреч для каждой пары узлов:

contacts <- ddply(data, .(PERSON_A, PERSON_B), summarise
 , CONTACTS = length(c(PERSON_A, PERSON_B)) /2
)

но для меня между этим и нужным мне результатом огромная горка.

В заключение я прочитал Как сделать отличный воспроизводимый пример R? и старался изо всех сил :)

Спасибо,


person Eduardo    schedule 07.11.2011    source источник
comment
ваш вывод не имеет смысла. опубликованные вами данные содержат 97 строк, но общая сумма meetings в вашем выводе намного превышает это значение. вы, скорее всего, дважды считаете встречу, так как сумма 194   -  person Ramnath    schedule 07.11.2011
comment
вы можете сделать ваши примеры воспроизводимыми более простым способом: попробуйте использовать dput(yourdataframe) и вставьте результат. Соответственно используйте dput(head(yourdataframe)).   -  person Matt Bannert    schedule 07.11.2011


Ответы (1)


попробуй это:

> d2 <- transform(data, m = floor(MEET/86400) + 1, l = floor(LEAVE/86400) + 1)
> d3 <- subset(d2, m == l)
> table(d3$m) * 2

 1  2  3  4  5  6  7  8  9 10 11 12 45 
38 10 16 18 24  6  4 10 28 14 22  2  2 

floor(x/(60*60*24)) — это быстрый способ перевести секунды в сутки.

person kohske    schedule 07.11.2011