假设我有以下数据
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中实现?
答案 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