用r替换0和-ve值并从每小时转换为每日

问题描述 投票:0回答:1

我有一个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
r date datetime
1个回答
0
投票

首先让我们创建一些虚拟数据:

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)))获得每日平均值。

© www.soinside.com 2019 - 2024. All rights reserved.