Перечислите все переменные (и их пропорции) в подмножестве кадра данных

Для примерной рамки данных, содержащей коллекцию продольных и широтных пар координат и времени, в течение которых находился объект:

bout <- structure(list(Date = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "02/02/2013", class = "factor"),
Time = structure(1:30, .Label = c("07:55:40", "07:55:50",
"07:56:00", "07:56:10", "07:56:20", "07:56:30", "07:56:40",
"07:56:50", "07:57:00", "07:57:10", "07:57:20", "07:57:30",
"07:57:40", "07:57:50", "07:58:00", "07:58:10", "07:58:20",
"07:58:30", "07:58:40", "07:58:50", "07:59:00", "07:59:10",
"07:59:20", "07:59:30", "07:59:40", "07:59:50", "08:00:00",
"08:00:10", "08:00:20", "08:00:30"), class = "factor"), Axis1 = c(0L,
0L, 100L, 500L, 233L, 155L, 60L, 0L, 0L, 115L, 80L, 878L,
158L, 0L, 13L, 0L, 0L, 25L, 10L, 45L, 33L, 43L, 655L, 498L,
41L, 151L, 404L, 436L, 28L, 0L), Latitude = c(56.52289678,
56.52291659, 56.52292762, 56.52295108, 56.52292694, 56.52292513,
56.5229401, 56.52294825, 56.52295531, 56.52296413, 56.52296976,
56.52292374, 56.52293053, 56.52292422, 56.52289636, 56.52288866,
56.52293357, 56.52290114, 56.5228365, 56.52280237, 56.52279844,
56.52281107, 56.52282589, 56.52279711, 56.52277008, 56.52278785,
56.52279951, 56.52269176, 56.52270186, 56.52269016), Longitude = c(-2.56573101,
-2.56578171, -2.56579263, -2.56578099, -2.56575181, -2.56574877,
-2.56575947, -2.5657653, -2.56577941, -2.56577104, -2.56577004,
-2.56576048, -2.56575937, -2.56582402, -2.56585538, -2.56579373,
-2.56572003, -2.56568263, -2.56568237, -2.56570739, -2.56570637,
-2.56571299, -2.56572322, -2.56566835, -2.56566237, -2.56569353,
-2.56571833, -2.56563307, -2.56565902, -2.56565666), area = structure(c(1L,
1L, 2L, 2L, 2L, 2L, 3L, 4L, 5L, 6L, 6L, 7L, 7L, 7L, 8L, 9L,
10L, 11L, 2L, 2L, 6L, 6L, 6L, 6L, 12L, 13L, 13L, 13L, 13L,
13L), .Label = c("E456", "E457", "E460", "E461", "E462",
"E463", "E465", "E468", "E469", "E470", "E471", "E478", "E479"
), class = "factor"), bout = c(0L, 0L, 1L, 1L, 1L,
1L, 1L, 0L, 0L, 2L, 2L, 2L, 2L, 2L, 2L, 0L, 0L, 0L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 0L)), .Names = c("Date",
"Time", "Axis1", "Latitude", "Longitude", "area", "bout"
), class = "data.frame", row.names = c(NA, -30L))

Я хочу создать сводные переменные об активности. До сих пор я:

bout$Date <- as.Date(bout$Date, origin = "1970-01-01", format = "%d/%m/%Y")
library(chron)
bout$Time <- times(as.character(bout$Time))

my.stats <- function(x) {
    min.Date <- min(x$Date)
    min.Time <- min(x$Time)
    max.Time <- max(x$Time)
    time.bout <- max.Time - min.Time
    return(data.frame(min.Date, min.Time, max.Time, time.bout))
}

library(plyr)
ddply(bout, .(bout), my.stats)

После этих переменных мне также нужен список областей, в которых каждая активность имеет место.

Я бы обычно использовал:

unique(unlist(bout$area, use.names = FALSE))

Но мне интересно, как я также сообщаю о соотношении времени, проведенного в каждой из этих областей? В идеале я хотел бы, чтобы это интегрировалось в функцию выше. Там никогда не должно быть больше 10 областей для каждого вида деятельности (поэтому я доволен пробелами, когда указано меньше областей).

Например (показано только две области):

bout     area.1      time.area.1      area.2      time.area.2 
2        E457        0.80             E460        0.20       
3        E465        0.50             E463        0.33  

Любые идеи были бы очень оценены.

Ответ 1

Для того, что вы хотите сделать, матрица выше с пробелами - довольно неуклюжий стиль и сложный (er) для создания. Следующее может быть более полезным (и отображает ту же информацию).

Данные настройки:

bout$StartTime <- times(as.character(bout$Time))
bout$EndTime <- bout$StartTime + times("00:00:10")

Совокупный

library(data.table)
bout.result <- setDT(bout)[order(bout), list(Date = min(Date), Dur = max(Time) - min(Time)), by = c("bout","area")]

Это даст вам продолжительность каждого уникального боя, определенного поединком и областью. Я также воспроизвел вашу запись min (Date). Если есть более 10 областей/бит, вы можете просто добавить еще несколько строк.

Пропорция:

boutPro <- bout.result[, list(boutDur = times(sum(Dur))), by = "bout"]
bout.result <- merge(bout.result,boutPro, by = "bout")
bout.result$prop <- as.numeric(bout.result$Dur/bout.result$boutDur)

Результаты

bout.result

    bout area       Date      Dur  boutDur       prop
 1:    0 E456 2013-02-02 00:00:20 00:01:20 0.25000000
 2:    0 E461 2013-02-02 00:00:10 00:01:20 0.12500000
 3:    0 E462 2013-02-02 00:00:10 00:01:20 0.12500000
 4:    0 E469 2013-02-02 00:00:10 00:01:20 0.12500000
 5:    0 E470 2013-02-02 00:00:10 00:01:20 0.12500000
 6:    0 E471 2013-02-02 00:00:10 00:01:20 0.12500000
 7:    0 E479 2013-02-02 00:00:10 00:01:20 0.12500000
 8:    1 E457 2013-02-02 00:00:40 00:00:50 0.80000000
 9:    1 E460 2013-02-02 00:00:10 00:00:50 0.20000000
10:    2 E463 2013-02-02 00:00:20 00:01:00 0.33333333
11:    2 E465 2013-02-02 00:00:30 00:01:00 0.50000000
12:    2 E468 2013-02-02 00:00:10 00:01:00 0.16666667
13:    3 E457 2013-02-02 00:00:20 00:01:50 0.18181818
14:    3 E463 2013-02-02 00:00:40 00:01:50 0.36363636
15:    3 E478 2013-02-02 00:00:10 00:01:50 0.09090909
16:    3 E479 2013-02-02 00:00:40 00:01:50 0.36363636