среднее время между сгруппированными событиями - PullRequest
0 голосов
/ 08 марта 2012

df - боевые события годами и конфликтами. Я пытаюсь вычислить среднее расстояние (по времени) между битвами в годы конфликта.

Заголовок выглядит примерно так:

conflictId | year | event_date | event_type
107          1997   1997-01-01   1
107          1997   1997-01-01   1
20           1997   1997-01-01   1
20           1997   1997-01-01   2
20           1997   1997-01-03   1

То, что я впервые попробовал, было

time_prev_total <- aggregate (event_date ~ conflictId + year, data, diff)

но я получаю event_date список в новом df. Попытки извлечь первую позицию индекса в списке в df не увенчались успехом.

В качестве альтернативы мне предложили создать индекс времени в каждом конфликтном году, затем отстать от этого индекса, создать новый фрейм данных с conflictId, year, event_date и отстающий индекс, и затем объедините его с исходным df, но сопоставьте отстающий индекс в новом df со старым индексом в исходном df. Я пытался реализовать это, но я немного не уверен, как индексировать obs. в годы конфликта, поскольку он неуравновешен.

1 Ответ

2 голосов
/ 08 марта 2012

Вы можете использовать ddply, чтобы разбить data.frame на части (по одному в год и конфликт) и применить функцию к каждому.

# Sample data
n <- 100
d <- data.frame(
  conflictId = sample(1:3,       n, replace=TRUE),
  year       = sample(1990:2000, n, replace=TRUE),
  event_date = sample(0:364,     n, replace=TRUE),
  event_type = sample(1:10,      n, replace=TRUE)
)
d$event_date <- as.Date(ISOdate(d$year,1,1)) + d$event_date
library(plyr)

# Average distance between battles, within each year and conflict
ddply(
  d, 
  c("year","conflictId"), 
  summarize,
  average = mean(dist(event_date))
)

# Average distance between consecutive battles, within each year and conflict
d <- d[order(d$event_date),]
ddply(
  d, 
  c("year","conflictId"), 
  summarize,
  average = mean(diff(event_date))
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...