需要比较具有多个条件的列中的值,并使用R对其他列中的值求和

时间:2018-12-16 09:59:16

标签: r

我的数据框如下

    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

我想基于相同的月份和年份对vol求和    即检查名称和月份+年份是否相同然后相加的条件         Vol

中的值
    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 :(得分:0)

形成Month和Year列(使用库lubridate是最简单的),然后按以下新变量分组:

library(lubridate)
library(dplyr)

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

df %>% group_by(name, Month, Year) %>% count()

答案 1 :(得分:0)

您可以使用软件包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)

答案 2 :(得分:0)

基于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

答案 3 :(得分:0)

简短的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