【问题标题】:mutate function with nested ifelse statements creating two columns instead of one使用嵌套 ifelse 语句创建两列而不是一列的 mutate 函数
【发布时间】:2020-08-15 22:37:18
【问题描述】:

我有一些国家/地区的 covid-19 病例的累积数据,我正在尝试计算一个名为 Diff 的新列中的差异。我无法删除 NA 值,因为它不会显示没有进行测试的日期。所以我已经做到了,如果有一个 NA 值,将 Diff 值设置为 0 以表示没有差异,因此当天没有进行任何测试。

我也在尝试发表声明,如果 Diff 也是 NA,表示前一天没有进行任何测试,那么将差异设置为当天的确诊病例值。

正如您从底部的结果中看到的那样,我快到了,但我正在创建一个名为 ifelse 的新列。我试图解决这个问题,但我认为我在某处犯了一个简单的错误。如果有人能指出来,我将不胜感激,谢谢。

编辑:当延迟计算 = NA 时,我意识到我在考虑将每日病例设置为确诊病例时犯了一个逻辑错误,因为这给出了一个误导性的答案。

我在大型数据集上使用下面的代码来填充并在出现 NA 时重复之前的值。我按组过滤,以免简单地跨国家传播正向值。

然后我计算了延迟,然后使用 Ronak Shah 的代码获取每日值。

data <- data %>%
            group_by(CountryName) %>%
            fill(ConfirmedCases, .direction = "down")

data <- data %>%
            mutate(lag1 = ConfirmedCases - lag(ConfirmedCases))

data <- data %>% mutate(DailyCases = replace_na(coalesce(lag1, ConfirmedCases), 0))


library(tidyverse)

data <- data.frame(
          stringsAsFactors = FALSE,
                        CountryName = c("Afghanistan","Afghanistan",
                                        "Afghanistan","Afghanistan","Afghanistan",
                                        "Afghanistan","Afghanistan",
                                        "Afghanistan","Afghanistan","Afghanistan",
                                        "Afghanistan","Afghanistan","Afghanistan",
                                        "Afghanistan","Afghanistan",
                                        "Afghanistan","Afghanistan","Afghanistan",
                                        "Afghanistan","Afghanistan","Afghanistan",
                                        "Afghanistan","Afghanistan",
                                        "Afghanistan","Afghanistan","Afghanistan",
                                        "Afghanistan","Afghanistan","Afghanistan",
                                        "Afghanistan","Afghanistan"),
                     ConfirmedCases = c(NA,7L,NA,NA,NA,10L,16L,21L,
                                        22L,22L,22L,24L,24L,34L,40L,42L,
                                        75L,75L,91L,106L,114L,141L,166L,
                                        192L,235L,235L,270L,299L,337L,367L,
                                        423L),
                               Diff = c(NA,NA,NA,NA,NA,NA,6L,5L,1L,
                                        0L,0L,2L,0L,10L,6L,2L,33L,0L,16L,
                                        15L,8L,27L,25L,26L,43L,0L,35L,
                                        29L,38L,30L,56L)
                 )

data2 <- data %>%
  mutate(Diff = ifelse(is.na(ConfirmedCases) == TRUE, 0, ConfirmedCases - lag(ConfirmedCases)),
                       ifelse(is.na((ConfirmedCases - lag(ConfirmedCases))) == TRUE, ConfirmedCases, ConfirmedCases - lag(ConfirmedCases)))

head(data2, 10)
#>    CountryName ConfirmedCases Diff ifelse(...)
#> 1  Afghanistan             NA    0          NA
#> 2  Afghanistan              7   NA           7
#> 3  Afghanistan             NA    0          NA
#> 4  Afghanistan             NA    0          NA
#> 5  Afghanistan             NA    0          NA
#> 6  Afghanistan             10   NA          10
#> 7  Afghanistan             16    6           6
#> 8  Afghanistan             21    5           5
#> 9  Afghanistan             22    1           1
#> 10 Afghanistan             22    0           0

reprex package (v0.3.0) 于 2020-08-15 创建

【问题讨论】:

    标签: r if-statement tidyverse dplyr


    【解决方案1】:

    也许这可以通过创建目标列的副本来提供帮助:

    library(tidyverse)
    
    data %>% mutate(D=ConfirmedCases,D=ifelse(is.na(D),0,D),
                    Diff2 = c(0,diff(D)),Diff2=ifelse(Diff2<0,0,Diff2)) %>% select(-D)
    

    输出:

       CountryName ConfirmedCases Diff Diff2
    1  Afghanistan             NA   NA     0
    2  Afghanistan              7   NA     7
    3  Afghanistan             NA   NA     0
    4  Afghanistan             NA   NA     0
    5  Afghanistan             NA   NA     0
    6  Afghanistan             10   NA    10
    7  Afghanistan             16    6     6
    8  Afghanistan             21    5     5
    9  Afghanistan             22    1     1
    10 Afghanistan             22    0     0
    11 Afghanistan             22    0     0
    12 Afghanistan             24    2     2
    13 Afghanistan             24    0     0
    14 Afghanistan             34   10    10
    15 Afghanistan             40    6     6
    16 Afghanistan             42    2     2
    17 Afghanistan             75   33    33
    18 Afghanistan             75    0     0
    19 Afghanistan             91   16    16
    20 Afghanistan            106   15    15
    21 Afghanistan            114    8     8
    22 Afghanistan            141   27    27
    23 Afghanistan            166   25    25
    24 Afghanistan            192   26    26
    25 Afghanistan            235   43    43
    26 Afghanistan            235    0     0
    27 Afghanistan            270   35    35
    28 Afghanistan            299   29    29
    29 Afghanistan            337   38    38
    30 Afghanistan            367   30    30
    31 Afghanistan            423   56    56
    

    【讨论】:

    • 解决了问题!非常感谢。我只有一个关于代码的问题,所以我理解正确。 ``` Diff2 = c(0,diff(D)) ```你能解释一下为什么使用 c(0, diff(d))。除了我不理解那部分之外,其他一切都有意义。
    • @O.MacDonald 太棒了!关于代码你想知道什么?
    • 我希望你能看到我所做的编辑。我在写完问题之前不小心按了输入哈哈。
    • @O.MacDonald Diff2 = c(0,diff(D)) 创建一个列,其值的差异类似于您对 lag 列所做的操作。零是因为第一个值不能有差异,因为它没有先前的值。 diff 所做的是计算实际行与前一行的差异,并对所有行执行此操作,如您所见。我希望这可以帮助您弄清楚您的疑问:)
    • 谢谢!我忘记了 Diff 是一个基本命令,我的列的命名让我很困惑哈哈。感谢您的解释和时间。一切顺利。
    【解决方案2】:

    我认为您可以使用coalesceDiffConfirmedCases 获取第一个非NA 值,如果它们都是NA,则将其替换为0。

    library(dplyr)
    data %>%
      mutate(Diff2 = tidyr::replace_na(coalesce(Diff,  ConfirmedCases), 0))
    
    #   CountryName ConfirmedCases Diff Diff2
    #1  Afghanistan             NA   NA     0
    #2  Afghanistan              7   NA     7
    #3  Afghanistan             NA   NA     0
    #4  Afghanistan             NA   NA     0
    #5  Afghanistan             NA   NA     0
    #6  Afghanistan             10   NA    10
    #7  Afghanistan             16    6     6
    #8  Afghanistan             21    5     5
    #9  Afghanistan             22    1     1
    #10 Afghanistan             22    0     0
    #11 Afghanistan             22    0     0
    #12 Afghanistan             24    2     2
    #...
    #...
    

    【讨论】:

    • 谢谢 Ronak,这个解决方案效果很好,比我的想法更优雅。
    猜你喜欢
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多