С помощью data.table
мы преобразуем «data.frame» в «data.table» (setDT(df1)
), сгруппированные по классам year
из Date
, преобразованным «date» и «chemical», получимsum
логического вектора и dcast
его в «широкий» формат
library(data.table)
library(lubridate)
dcast(setDT(df1)[, sum(concentration > limit),
.(date = year(dmy(date)), Chemical)], date ~ Chemical)
# date A B C
#1: 2016 2 1 1
#2: 2017 1 2 0
или с использованием base R
с xtabs
xtabs(cond ~ date + Chemical, transform(df1, date = substr(date, 7, 10),
cond = concentration > limit))
# Chemical
#date A B C
# 2016 2 1 1
# 2017 1 2 0
data
df1 <- structure(list(Chemical = c("A", "A", "A", "A", "B", "B", "B",
"B", "C", "C", "C", "C"), date = c("01-01-2016", "01-02-2016",
"01-01-2017", "01-02-2017", "01-01-2016", "01-02-2016", "01-01-2017",
"01-02-2017", "01-01-2016", "01-02-2016", "01-01-2017", "01-02-2017"
), concentration = c(0.2, 0.2, 0.005, 0.2, 0.3, 0.05, 0.2, 0.2,
1.2, 0.8, 0.9, 0.9), limit = c(0.01, 0.01, 0.01, 0.01, 0.1, 0.1,
0.1, 0.1, 1, 1, 1, 1)), class = "data.frame", row.names = c(NA,
-12L))