【问题标题】:replace 0 and -ve values with r and convert from hourly to daily用 r 替换 0 和 -ve 值并将每小时转换为每天
【发布时间】:2018-09-18 08:28:33
【问题描述】:

我有一个包含 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】:

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

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

【讨论】:

    猜你喜欢
    • 2021-06-13
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 2019-08-22
    • 1970-01-01
    • 2021-02-13
    相关资源
    最近更新 更多