我有一个38列和78880行的文件。有些列有0和负值。我想在所有列中用NaN替换0和负值。
我试过了
replace(new_file, which(new_file <= 0), NA)
但它不起作用。
之后,给定的文件是每小时数据。所以我需要转换为每日并将所有38列保存在一个带有日期(YYYY-MM-DD)的新文件中。
Date Var1 Var2 Var3 ......
2009-01-01
2009-01-02
2009-01-03
首先让我们创建一些虚拟数据:
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
应用于除Date之外的所有列。
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)))
获得每日平均值。