Построение точечного максимума нескольких серий - PullRequest
3 голосов
/ 09 июля 2011

У меня есть CSV, который я импортировал, который имеет несколько полей данных для временного ряда. Таким образом, первое поле - это дата и время, а остальные поля - это разные точки данных.

Как мне построить точечное максимальное значение нескольких полей, где поля будут сопоставляться с каким-то подстановочным знаком?

Так, например:

time,foo1,foo2,foo3
1:00,1,2,3
2:00,3,1,1
3:00,2,5,3

Какой самый простой способ построить foo.* такой, чтобы я получил максимум от каждого поля: Т.е. результирующий график из этого примера будет: (1: 00,3), (2: 00,3), (3: 00,5)?

Чтобы прояснить пример, я имею в виду максимальное количество точек в **

time,foo1,foo2,foo3
1:00,1,2,*3*
2:00,*3*,1,1
3:00,2,*5*,3

Ответы [ 2 ]

6 голосов
/ 09 июля 2011

Если ваши данные находятся в data.frame x, вы можете использовать pmax, например, так:

cbind(x[,"time"], do.call(pmax, x[,grepl("^foo*",names(x))]))

do.call вызывает функцию pmax с каждым столбцом в xв качестве аргумента ... (кроме первого столбца, который удаляется отрицательной подпиской).cbind объединяет первый столбец x с результирующим вектором из do.call.

Обратите внимание, что второй аргумент do.call должен быть списком, а data.frame - это список с некоторымидополнительные атрибуты.Если x не является data.frame, вам нужно привести его к одному (или обычному списку).

2 голосов
/ 09 июля 2011

Это почти неловко по сравнению с хитрым ответом @Joshua, но я, вероятно, подошел бы к этому, используя reshape2 и plyr, если бы другой ответ не был мне понятен melt превращает данные в «длинный» формат, а затем ddply группирует по столбцу времени и выбирает максимальное значение.

library(plyr)
library(reshape2)


dat <- data.frame(time = 1:3, foo1 = c(1,3,2), foo2 = c(2,1,5), foo3 = c(3,1,3))
dat.m <- melt(dat, id.vars = "time")
ddply(dat.m, "time", summarize, max = max(value))
  time max
1    1   3
2    2   3
3    3   5

Испытания подтверждают, что ответ Иисуса Навина примерно в 30 раз быстрее. Единственное реальное преимущество моего решения состоит в том, что оно может быть легче для понимания, но это очень субъективно. Результаты:

library(rbenchmark)
f_svelte <- function(dat){
  cbind(dat[,1], do.call(pmax, dat[,-1]))

}

f_fat <- function(dat) {
  dat.m <- melt(dat, id.vars = "time")
  ddply(dat.m, "time", summarize, max = max(value))  
}

benchmark(f_svelte(dat), f_fat(dat)
          , columns = c("test", "elapsed", "relative")
          , order = "relative"
          , replications = 500
          )

           test elapsed relative
1 f_svelte(dat)    0.11  1.00000
2    f_fat(dat)    3.59 32.63636
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...