Как рассчитать значения в одном кадре данных на основе значений в другом кадре данных - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть фрейм данных, который содержит несколько разных анализов, каждый из которых состоит из нескольких строк данных.Я хочу вычислить среднее значение только для нескольких строк из каждого анализа, и какие линии они варьируются от анализа к анализу.Существует один кадр данных, содержащий анализы, а другой - номера начальной и конечной строк, требуемые для среднего значения каждого анализа.Ниже приведен простой пример.

Анализы

df1 <- structure(list(analysis = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), 
               line = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L),
               value = c(4.8, 9.8, 7.1, 7.4, 7.4, 3.3, 4.5, 8.7, 3.9, 3.6, 1.9, 9.4, 0.9, 0.6, 2.1, 6.1, 5.3, 4.7, 9.7, 8.6, 8.9, 3.4, 8.7, 7.1)),
          class = "data.frame", row.names = c(NA, -24L))

Номера начальной и конечной строк, по которым я хотел бы получить среднее значение для каждого анализа:

df2 <- structure(list(analysis = 1:3,
               startnum = c(3L, 3L, 2L),
               endnum = c(7L, 6L, 4L)),
          class = "data.frame", row.names = c(NA, -3L))

IПредставьте, что итоговый фрейм данных будет выглядеть так:

structure(list(analysis=1:3,
               avgval=c(5.94, 3.2, 7.67)),
          class = "data.frame", row.names = c(NA, -3L))

Я считаю, что ответ прост для семейства 'apply', но не могу придумать, как это сделать.Я могу преобразовать кадры данных в списки для «lapply», но не знаю, как действовать дальше.

Заранее большое спасибо, -R

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

В tidyverse вы можете сделать:

df1 %>%
 left_join(df2, by = c("analysis" = "analysis")) %>% #Merging df1 with df2
 group_by(analysis) %>% #Grouping by "analysis"
 summarise(avgval = mean(value[line >= startnum & line <= endnum])) #Calculating the mean based on given conditions

  analysis avgval
     <int>  <dbl>
1        1   5.94
2        2   3.20
3        3   7.67
0 голосов
/ 06 декабря 2018

Вот способ использования data.table

library(data.table)
setDT(df1)
setDT(df2)

Создание столбца line в df2 в виде последовательности от startnum до endnum по группам.

df2 <- df2[, .(line = seq(startnum, endnum)), by = analysis]

Соедините две таблицы данных и агрегируйте по группам.

out <- df1[df2, on = c("analysis", "line")]
out <- out[, .(avgval = mean(value)), by = analysis]
out
#   analysis   avgval
#1:        1 5.940000
#2:        2 3.200000
#3:        3 7.666667

Если вы хотите продолжить с data.frame, позвоните setDF(out).

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...