Сначала давайте создадим фиктивные данные:
N <- 10
df <- data.frame(Date=rep("2018-09-18", N),
Var1=rnorm(N),
Var2=rnorm(N),
Var3=rnorm(N))
df
выглядит как:
Date Var1 Var2 Var3
1 2018-09-18 0.7806645 1.06439912 -0.82916929
2 2018-09-18 0.8206491 2.22059077 -0.12357957
3 2018-09-18 -0.4384802 0.56787833 0.50516721
4 2018-09-18 -0.5979955 0.10862365 0.42544565
Теперь давайте напишем функцию для работы с одним столбцом (т.е. вектором).
ifelse
удобно, потому что оно уже векторизовано .
# Function handling one vector
fix_negative_values <- function(vec) {
ifelse(vec > 0, vec, NA)
}
Используя dplyr
для простоты манипулирования данными, мы применяем fix_negative_values
ко всем столбцам, кроме даты.
library(dplyr)
df %>% mutate_at(vars(-Date), fix_negative_values)
Это дает:
Date Var1 Var2 Var3
1 2018-09-18 0.7806645 1.0643991 NA
2 2018-09-18 0.8206491 2.2205908 NA
3 2018-09-18 NA 0.5678783 0.50516721
4 2018-09-18 NA 0.1086236 0.42544565
Если вы хотите превратить почасовые данные в ежедневные, вы найдете dplyr
полезным, поскольку вы можете group_by(date)
, а затем summarize_at(vars(-Date), funs(mean(., na.rm=T)))
, чтобы получить среднесуточное значение.