Я нахожу некоторые субоптимальные шаги в моем текущем рабочем процессе анализа данных, когда дело доходит до переключения между длинными и широкими форматами. Рассмотрим три следы показано ниже, с общими x
значениями,long vs wide, tidy vs эффективный
Мои данные в длинном формате, полезно для построения и всех видов зычный вещей, но для некоторых частей анализа, кажется, гораздо проще иметь дело с широким (матричным) форматом. Например, в этом фиктивном примере я могу установить базовую линию на 0 для всех трасс, вычитая среднее значение для каждой трассы между 0 и 0,25 (заштрихованная серая область).
Я не могу найти простой способ делать подобные вещи в длинном формате.
Моя текущая стратегия - вернуться к широкому формату, но i) Я никогда не помню правильный синтаксис для dcast/reshape, ii) это довольно неэффективно, чтобы продолжать движение вперед и назад между ними.
dwide <- reshape2::dcast(dlong, x~..., value.var="y")
dwide[,-1] <- sweep(dwide[,-1], 2, colMeans(dwide[dwide$x < 0.25, -1]), FUN="-")
dlong2 <- melt(dwide, id="x")
я пропустил некоторые инструменты, которые могли бы помочь? Я открыт для предложений data.table.
Полный воспроизводимый пример:
library(ggplot2)
library(plyr)
library(reshape2)
## dummy data as noisy lorentzian-shaped peaks with random offset
set.seed(1234)
fake_data <- function(a, x = seq(0, 1, length=100)){
data.frame(x = x,
y = jitter(1e-3/((x - a)^2 + 1e-3) + runif(1,0,1),
amount = 0.1))
}
## apply function to all combinations of parameters (one here)
dlong <- plyr::mdply(data.frame(a = c(0.4,0.5,0.6)), fake_data)
ggplot(dlong, aes(x, y, colour=factor(a))) + geom_line() +
annotate("rect", xmin=-Inf, xmax=0.25, ymin=-Inf, ymax=Inf, fill="grey", alpha = 0.3) +
theme_minimal()
dwide <- reshape2::dcast(dlong, x~..., value.var="y")
str(dwide)
dwide[,-1] <- sweep(dwide[,-1], 2, colMeans(dwide[dwide$x < 0.25, -1]), FUN="-")
dlong2 <- melt(dwide, id="x")
ggplot(dlong2, aes(x, value, colour=variable)) + geom_line() +
theme_minimal()
Я считаю, '' tidyr' в gather' и 'spread' требуют меньше, чем мысль' reshape2', за исключением того, что 'spread' может быть очень тонким в отношении индексов.Здесь 'dwide <- dlong %>% spread (a, y)' и 'dlong2 <- dwide %>% gather (variable, value, -x)' (или используйте 'a' и' y' вместо 'variable' и' value', чтобы сохранить оригинал имена). – alistaire
Согласен, они кажутся более интуитивными. Я попытаюсь использовать их больше – baptiste