如何计算满足R中df中某些条件的值的数量

时间:2018-06-05 22:46:31

标签: r

假设我有以下数据

date  value location
1/1    10      A    
1/2    15      A
1/3    20      A
2/1    15      A
2/2    10      A
2/3    5       A
2/4    12      B
2/5    15      B
2/6    5       B
2/7    20      A

我希望在按位置聚合的1/31之后计算所有超过10的值。所以我的输出会给我3个位置A和2个位置B. 任何想法如何在R中实现?

3 个答案:

答案 0 :(得分:2)

一旦您标准化了日期字段(假设年份是2018年),您可以使用dplyr包将数据集过滤到您需要的条件,并按位置和计数进行分组。

library(dplyr)

df <- df %>%
  mutate(date = as.Date(paste0(df$date, '/', format(Sys.Date(), '%Y')),
                        format = '%m/%d/%Y')) %>%
  filter(date > as.Date('2018-01-31')) %>%
  filter(value >= 10) %>%
  group_by(location) %>%
  tally()

答案 1 :(得分:2)

使用基数R你可以这样做:

newdat=subset(transform(dat,date=strptime(date,"%m/%d")),date>as.Date("2018-01-31")&value>=10)
table(newdat$location)
A B 
3 2 

  aggregate(value~location,newdat,length)
  location value
1        A     3
2        B     2

考虑thelaemail的评论,你可以这样做:

aggregate(value~location,dat,length,subset = strptime(date,"%m/%d")>as.Date("2018-01-31")&value>=10)
  location value
1        A     3
2        B     2

答案 2 :(得分:1)

向D.sen的答案添加一些lubridate功能:

library(tidyverse)
library(lubridate)

thresh <- 10
date_thresh <- "2018-01-31"

df %>%
  mutate(date = mdy(paste0(date, "/2018"))) %>%
  filter(date > date_thresh, value > thresh) %>%
  group_by(location) %>%
  tally()

# A tibble: 2 x 2
  location     n
  <fct>    <int>
1 A            2
2 B            2