Необходимо сравнить значения в столбце с несколькими условиями и суммировать значения в другом столбце, используя R - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть фрейм данных следующим образом

    name    dates   vol
    a             02/23/2017         1
    a             02/27/2017         2
    a             03/14/2018         10
    a             03/26/2018         8
    b             07/10/2017         5
    b             07/15/2018         15
    b             08/20/2018         25

Я хочу суммировать объем на основе того же месяца и года, т.е. условие, которое проверяет, совпадают ли имена и месяц + год, затем суммирует значения из объема

    expected output as:
     name  Total.Vol
     a          3         (1+2 sum of value which belong to same month+year
     a          18        10+8
     b          5
     b          35        (15+20)

Ответы [ 4 ]

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

Короткое dplyr решение:

library(dplyr)

df %>% 
  group_by(name, yrmon = format(as.Date(dates, "%m/%d/%Y"), "%Y-%m")) %>%
  summarise(Total.Vol = sum(vol))

Вывод:

  name  yrmon   Total.Vol
  <chr> <chr>       <int>
1 a     2017-02         3
2 a     2018-03        18
3 b     2017-07         5
4 b     2018-07        15
5 b     2018-08        25
0 голосов
/ 16 декабря 2018

Вы можете сделать это, используя функцию as.yearmon из пакета zoo, чтобы получить дату года / месяца и базовую функцию R aggregate.
Но сначала преобразуйте столбец в класс Date.

library(zoo)

df1$dates <- as.Date(df1$dates, "%m/%d/%Y")

aggregate(vol ~ name + as.yearmon(dates), df1, sum)
#  name as.yearmon(dates) vol
#1    a          fev 2017   3
#2    b          jul 2017   5
#3    a          mar 2018  18
#4    b          jul 2018  15
#5    b          ago 2018  25

Данные.

df1 <- read.table(text = "
   name    dates   vol
    a             02/23/2017         1
    a             02/27/2017         2
    a             03/14/2018         10
    a             03/26/2018         8
    b             07/10/2017         5
    b             07/15/2018         15
    b             08/20/2018         25                  
", header = TRUE)
0 голосов
/ 16 декабря 2018

A data.table решение на основе

library(data.table)
setDT(df)
df[, dates := as.Date(dates, "%m/%d/%Y")]
df[, sum(vol), by = .(name, ym = format(dates, "%Y-%m"))]

   name      ym V1
1:    a 2017-02  3
2:    a 2018-03 18
3:    b 2017-07  5
4:    b 2018-07 15
5:    b 2018-08 25
0 голосов
/ 16 декабря 2018

Сформируйте столбец Месяца и Года (используя библиотеку lubridate - самый простой), а затем сгруппируйте по следующим новым переменным:

library(lubridate)
library(dplyr)

df <- df %>% mutate(Month = month(dates), Year = year(dates))

df %>% group_by(name, Month, Year) %>% count()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...