【问题标题】:Infilling values from column in dataframe with conditional statement for NAs - R使用 NAs 的条件语句从数据框中的列中填充值 - R
【发布时间】:2018-12-13 18:43:55
【问题描述】:

我有一个如下的数据框:

Date        FLOW     Modelled   Infilled
01-01-1992  1.856    1.900      NA
02-01-1992  1.523    1.500      NA
03-01-1992  NA       2.400      NA    
04-01-1992  3.679    3.800      NA

我想用 FLOW 值填充 Infilled 列。在时间序列的 FLOW 列中有“NA”值的地方,我想用 Modeled 列中的值替换这些 NA。

答案应如下所示:

Date        FLOW     Modelled   Infilled
01-01-1992  1.856    1.900      1.856
02-01-1992  1.523    1.500      1.523
03-01-1992  NA       2.400      2.400    
04-01-1992  3.679    3.800      3.679

我在excel中有如下解决方案:

Infilled column   =IF((FLOW="NA"),Modelled,FLOW)

我还没有找到在线解决方案来帮助我在 R 中进行编程。时间序列非常长,我有多个文件要为此执行此操作,因此循环可能是最合适的解决方案。我对 R 比较陌生,我无法弄清楚这一点。非常感谢您的帮助!

【问题讨论】:

  • df$Infilled = ifelse(!is.na(df$FLOW), df$FLOW, df$Modelled)

标签: r if-statement conditional na


【解决方案1】:

您正在寻找coalesce

library(tidyverse)
dat%>%
   mutate(Infilled=coalesce(FLOW,Modelled))
        Date  FLOW Modelled Infilled
1 01-01-1992 1.856      1.9    1.856
2 02-01-1992 1.523      1.5    1.523
3 03-01-1992    NA      2.4    2.400
4 04-01-1992 3.679      3.8    3.679

在基础 R 中你可以这样做:

transform(dat,Infilled=ifelse(is.na(FLOW),Modelled,FLOW))
        Date  FLOW Modelled Infilled
1 01-01-1992 1.856      1.9    1.856
2 02-01-1992 1.523      1.5    1.523
3 03-01-1992    NA      2.4    2.400
4 04-01-1992 3.679      3.8    3.679

【讨论】:

    【解决方案2】:

    我们可以使用base R

    dat$Infilled <- dat$FLOW
    i1 <- is.na(dat$FLOW)
    dat$Infilled[i1] <- dat$Modelled[i1]
    

    data.table

    library(data.table)
    setDT(dat)[, Infilled := FLOW][is.na(FLOW), Infilled := Modelled][]
    

    【讨论】:

      猜你喜欢
      • 2017-07-04
      • 1970-01-01
      • 2022-01-17
      • 2020-05-03
      • 2020-08-11
      • 2021-06-07
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      相关资源
      最近更新 更多