Как создать частоту столбца, а затем выполнить агрегирование этих данных в R - PullRequest
0 голосов
/ 10 марта 2020

Цель:

У меня есть набор данных, df, который я буду sh, чтобы сначала подсчитать количество вхождений для каждой даты, а затем умножить вывод на определенное число .

Sent                      Duration   Length

1/7/2020  8:11:00 PM       34         216
1/22/2020 7:51:05 AM      432         111
1/7/2020  1:35:08 AM       57          90
1/22/2020 3:43:26 AM       22         212
1/22/2020 4:00:00 AM       55         500

Желаемый результат:

Date                     Count          Aggregation(80)
1/7/2020                 2              160
1/22/2020                3              240

I w * sh, чтобы подсчитать, сколько раз происходит конкретное «время-дата», а затем умножить этот результат. на 80. Дата 1/7/2020 встречается дважды, а дата 1/22/2020 - трижды. Затем я умножаю это число на число 80.

Вывод:

structure(list(Sent = structure(c(5L, 3L, 4L, 1L, 2L), .Label = c("1/22/2020 3:43:26 AM", 
"1/22/2020 4:00:00 AM", "1/22/2020 7:51:05 PM", "1/7/2020 1:35:08 AM", 
"1/7/2020 8:11:00 PM"), class = "factor"), Duration = c(34L, 
432L, 57L, 22L, 55L), length = c(216L, 111L, 90L, 212L, 500L)), class = "data.frame", row.names = c(NA, 
-5L))

Это то, что я пробовал:

df1<- aggregate(df$Sent, by=list(Category= df$dSent), 
    FUN=length)

Однако мне нужно вывести частоту появления дат вместе с агрегацией (умножить на 80)

Любые предложения приветствуются.

Ответы [ 3 ]

3 голосов
/ 10 марта 2020

Мы можем преобразовать Sent в POSIXct формат и извлечь дату, посчитать количество строк в каждой дате и умножить ее на 80. Используя dplyr, мы можем сделать это как:

library(dplyr)

df %>%
 group_by(Date = as.Date(lubridate::mdy_hms(Sent))) %>%
 summarise(Count = n(), `Aggregation(80)` = Count * 80)

#  Date       Count `Aggregation(80)`
#  <date>     <int>             <dbl>
#1 2020-01-07     2               160
#2 2020-01-22     3               240
3 голосов
/ 10 марта 2020

Использование table.

as.data.frame(cbind(Count=(r <- table(as.Date(df$Sent, format="%m/%d/%Y %H:%M:%S"))), 
      Agg=r*80))
#            Count Agg
# 2020-01-07     2 160
# 2020-01-22     3 240

или

`rownames<-`(as.data.frame(cbind(Count=(r <- table(as.Date(df$Sent, format="%m/%d/%Y %H:%M:%S"))), 
                    Agg=r*80, Date=names(r)))[c(3, 1:2)], NULL)
#         Date Count Agg
# 1 2020-01-07     2 160
# 2 2020-01-22     3 240
2 голосов
/ 10 марта 2020

Вот способ data.table вещей ..

код

library( data.table )
#set data as data.table
setDT(mydata)
#set timestamps as posix
mydata[, Sent := as.POSIXct( Sent, format = "%m/%d/%Y %H:%M:%S %p" ) ]
#summarise
mydata[, .(Count = .N, Aggregation = .N * 80), by = .(Date = as.Date(Sent) )]

вывод

#          Date Count Aggregation
# 1: 2020-01-07     2         160
# 2: 2020-01-22     3         240
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...