У меня есть датафрейм с символьными и числовыми данными. Я хотел бы использовать dplyr для создания сводки, сгруппированной по временным точкам и испытаниям, генерирующей следующее:
- средние
- Стандартные отклонения
- вариант
соотношение между временными точками
(и т. Д.)
Я чувствую, что все это можно сделать в трубе dplyr, но я изо всех сил пытаюсь сделать соотношение средних значений между временными точками в испытаниях.
Я полностью признаю, что, возможно, я беру с собой молоток в поисках гвоздей, поэтому, пожалуйста, не стесняйтесь рекомендовать решения, использующие другие пакеты или функции, но в идеале я бы хотел простой / понятный код для простоты использования несколькими сотрудниками. .
library(dplyr)
# creating an example DF
num <- runif(100, 50, 3200)
smpl <- 1:100
df <- data.frame( num, smpl)
df$time <- "time1"
df$time[seq(2,100,2)] <- "time2"
df$trial <- "a"
df$trial[26:50] <- "b"
df$trial[51:75] <- "c"
df$trial[75:100] <- "d"
# using the magic of pipelines to calculate useful things
df1 <- df %>%
group_by(time, trial) %>%
summarise(avg = mean(num),
var = var(num),
stdev = sd(num))
Я бы хотел получить [соотношение времени2 / времени1 среднего значения для каждого испытания] , включенного в этот блок выше, но я не знаю, как конкретно назвать "avg" по времени1 "против" time2 "внутри трубы.
С этого момента ничто не делает то, на что я надеюсь ...
df1 <- df1[with(df1,order(trial,time)),]
# this better ressembles my actual DF structure,
# so reordering it will make some of my next attempts to solve this make more sense
Я пытался использовать тот факт, что «каждая вторая строка» отличается (это не идеально, потому что у каждого df будет разное количество строк, поэтому я либо введу NA, либо потребуется постоянно менять эти # ( или написание функции, чтобы постоянно их менять))
tm2 <- data.frame(x=df1$avg[seq(2,4,2)])
tm1 <- data.frame(x=df1$avg[seq(1,3,2)])
минимально, это соотношение, которое я хотел бы включить в df, но привязанное к столбцам avg и trial:
tm2/tm1
Для меня не имеет значения, в каком временном ряду заканчивается это соотношение, при условии, что оно согласовано во всех испытаниях (поэтому, если в столбце соотношений есть «пусто» для каждого «времени1» и «значения» "для каждого" time2 ", это нормально).
# I added in a separate column to allow 'match' later
tm1$time <- "time1"
tm2$time <- "time1" # to keep them all 'in row'
df1$avg_tm1 <- tm1$x[match(df1$time, tm1$time)]
df1$avg_tm2 <- tm2$x[match(df1$time, tm2$time)]
но это также не соответствует «пробной версии», так как эта информация теряется в этом новом tm1 df; это действительно заставляет меня думать, что все это должно быть сделано в dplry в первый раз ...
Затем я попытался создать новый столбец в tm1 df с соотношением
tm2$ratio <-tm2$x/tm1$x
и добавляйте значения коэффициента только в том случае, если среднее значение соответствует
df1$ratio <- tm2$ratio[match(tm2$x, df1$avg)]
Это может сработать, но когда я извлекаю средние значения, они округляются, поэтому числа не совпадают точно. Я также осторожен с этим, потому что, если я обрабатываю смешные объемы данных, существует более высокая вероятность того, что два случайных средних будут достаточно похожи, чтобы не использовать эти соотношения.
Я попробовал несколько других вещей, которые полностью потерпели неудачу, поэтому давайте представим, что что-то работает, и ввели соотношение в df1 как отдельные столбцы
Тогда любые дальнейшие вычисления или аннотации будут простыми:
df2 <- df1 %>%
mutate(ratio = avg_tm2/avg_tm1,
lost = 1- ratio,
word = paste0(round(lost*100),"%"))
Но я все еще застрял на том, «как» вызывать определенные ячейки внутри канала или какие другие инструменты / пакеты использовать для вычисления дельт или соотношений между ячейками в одном столбце.
Заранее спасибо