需要将一列中的值与多个条件进行比较,并使用R求和其他列中的数值

  • 本文关键字:比较 其他 求和 一列 条件 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 的值

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)

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

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

library(lubridate)
library(dplyr)
df <- df %>% mutate(Month = month(dates), Year = year(dates))
df %>% group_by(name, Month, Year) %>% count()

您可以使用包zoo中的函数as.yearmon来获取年月日和基本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)

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

最新更新