Как суммировать уникальные значения в столбцах кадра данных по нескольким вложенным блокам в R - PullRequest
1 голос
/ 04 октября 2019

У меня есть датафрейм со столбцами для даты, времени, идентификатора, времени и глубины. Я использую ddply, чтобы получить среднее время и глубину для каждой уникальной даты и времени, так как есть повторяющиеся строки даты и времени. Однако в каждом блоке datetime может быть несколько уникальных значений id и повторяющиеся строки для отдельных идентификаторов. Поэтому, что мне нужно сделать для каждого блока даты и времени, так это вычислить среднее значение всех уникальных времен, взятых из блоков id. т.е. мне сначала нужно получить уникальные значения времени из каждого блока идентификатора, а затем я хочу вычислить среднее значение для всех уникальных значений времени, возвращаемых с помощью этого метода для каждого блока даты и времени. Я пытаюсь использовать%>% для этого, но это новый синтаксис для меня, и я изо всех сил. Будем благодарны за любую помощь или альтернативные предложения в оболочке ddply для datetime. Ниже приведен пример.

> dput(df3)
structure(list(datetime = c("23/03/2017 14:13:45", "23/03/2017 14:13:45", 
"23/03/2017 14:13:45", "23/03/2017 14:13:45", "23/03/2017 14:13:45", 
"23/03/2017 14:13:45", "23/03/2017 14:13:45", "23/03/2017 14:13:45", 
"23/03/2017 14:13:45", "23/03/2017 14:13:45", "23/03/2017 14:15:15", 
"23/03/2017 14:15:15", "23/03/2017 14:15:15", "23/03/2017 14:15:15", 
"23/03/2017 14:15:45", "23/03/2017 14:15:45", "23/03/2017 14:16:15", 
"23/03/2017 14:16:15", "23/03/2017 14:16:15", "23/03/2017 14:16:15", 
"23/03/2017 14:16:15", "23/03/2017 14:16:15", "23/03/2017 14:16:15"
), id = c(11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 12L, 
12L, 12L, 13L, 14L, 14L, 15L, 16L, 16L, 16L, 17L, 18L, 18L), 
    time = c(10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 
    3L, 3L, 3L, 1L, 2L, 2L, 1L, 3L, 3L, 3L, 1L, 2L, 2L), dep = c(0.448675132, 
    0.448675132, 0.448675132, 0.448675132, 0.448675132, 0.448675132, 
    0.448675132, 0.448675132, 0.448675132, 0.448675132, 0.285520539, 
    0.285520539, 0.285520539, 0.285520539, 0.316112025, 0.316112025, 
    0.326309187, 0.356900674, 0.356900674, 0.356900674, 0.38749216, 
    0.326309187, 0.326309187)), class = "data.frame", row.names = c(NA, 
-23L))

Моя попытка не работает:

#convert datetime to POSIXct
df3$datetime = as.POSIXct(strptime(df3$datetime, format="%d/%m/%Y %H:%M:%S"), tz="UTC")

#Now condense the dateframe by unique datetime summarising tim and dep cols
  dfCondensed = ddply(df3, .(datetime), summarise,
                      #get the mean time for each unique datetime, but calculate this using 
                      #all the unique time values found within each unique id 
                      meantime = group_by(id) %>% unique(time) %>% mean(),
                      #do the same as above but for dep
                      meandep = group_by(id) %>% unique(dep) %>% mean())

Желаемый вывод

> dfCondensed
             datetime   tim       dep
1 23/03/2017 14:13:45 10.00 0.4486751
2 23/03/2017 14:15:15  2.00 0.2855205
3 23/03/2017 14:15:45  2.00 0.3161120
4 23/03/2017 14:16:15  1.75 0.3492528

Ответы [ 3 ]

2 голосов
/ 04 октября 2019

Я думаю, что вы ищете:

library(dplyr)

df3 %>%
   distinct() %>%
   group_by(datetime) %>%
   summarise(dep = mean(dep), mean = mean(time))

#  datetime              dep  mean
#  <chr>               <dbl> <dbl>
#1 23/03/2017 14:13:45 0.449 10   
#2 23/03/2017 14:15:15 0.286  2   
#3 23/03/2017 14:15:45 0.316  2   
#4 23/03/2017 14:16:15 0.349  1.75
2 голосов
/ 04 октября 2019

здесь data.table подход

library(data.table)
setDT(df3)
unique(df3, by = c("datetime", "id"))[, .(mean.time = mean(time),
                                          mean.dep = mean(dep)), 
                                      by = .(datetime)][]

              datetime mean.time  mean.dep
1: 23/03/2017 14:13:45     10.00 0.4486751
2: 23/03/2017 14:15:15      2.00 0.2855205
3: 23/03/2017 14:15:45      2.00 0.3161120
4: 23/03/2017 14:16:15      1.75 0.3492528
0 голосов
/ 04 октября 2019

Мы можем использовать base R

df4 <- unique(df3)
by(df4[c('time', 'dep')], df4[c('datetime')], FUN = colMeans)

Или с aggregate из base R

aggregate(cbind(time, dep) ~ datetime, df4, mean)
#     datetime  time       dep
#1 23/03/2017 14:13:45 10.00 0.4486751
#2 23/03/2017 14:15:15  2.00 0.2855205
#3 23/03/2017 14:15:45  2.00 0.3161120
#4 23/03/2017 14:16:15  1.75 0.3492528
...