【问题标题】:Sequence of dates in RR中的日期序列
【发布时间】:2020-02-21 17:07:42
【问题描述】:

我需要患者在医院的所有天数,即 AufnDat 和 EntlDat 之间的天数。我将 seq 与 mutate 一起使用,如 reprex 所示,我收到错误: seq.Date 中的错误(from = dmy(AufnDat), to = dmy(EntlDat), by = "day"): 'from' muss Länge 1 haben

    ``` r
library(tidyverse)
library(lubridate)
#> 
#> Attache Paket: 'lubridate'
#> The following object is masked from 'package:base':
#> 
#>     date

df <- tibble::tribble(
         ~PLZ,     ~AufnDat,     ~EntlDat, ~Stat1,
        67067, "22.01.2020", "23.01.2020",   "1A",
        74936, "21.01.2020", "23.01.2020",   "1A",
        97999, "21.01.2020", "27.01.2020",   "0A",
        76669, "15.01.2020", "17.01.2020",    "1",
        69126, "07.01.2020", "13.01.2020",   "0A",
        68753, "13.01.2020", "17.01.2020",   "1A",
        74928, "23.01.2020", "28.01.2020",   "2A",
        64720, "10.01.2020", "13.01.2020",    "1",
        48599, "16.01.2020", "22.01.2020",   "0A",
        68723, "07.01.2020", "13.01.2020",   "0A"
        )

df <- df %>% mutate(seqdat = seq(from=dmy(AufnDat), to=dmy(EntlDat), by="day"))
#> Error in seq.Date(from = dmy(AufnDat), to = dmy(EntlDat), by = "day"): 'from' muss Länge 1 haben

``` 
if I try the same for one row without mutate it works

``` r


## this works:

seq(from=dmy(df[1,2]), to=dmy(df[1,3]), by="day")
#> [1] "2020-01-22" "2020-01-23"
```

reprex package (v0.3.0) 于 2020 年 2 月 21 日创建

区别和我的错在哪里?

【问题讨论】:

  • 当您在 from 和 to 中放置具有多个值的向量时,mutate 不起作用。您需要一个值。 df[1,2] 是一个信号值(第一行第二列中的那个),所以这就是为什么它起作用的原因。您是否尝试使用最小或最大 Augndat 或 Entldat?我不知道你到底想达到什么目标,所以有点难以提供帮助。

标签: r dplyr seq


【解决方案1】:

我们可以使用map2 循环遍历“Aufndat”、“EntlDat”中的每一个以获取“日期”的序列,因为seq 未针对fromto 进行矢量化。这将是一个list 列,我们可以unnest 来扩展数据集

library(dplyr)
library(purrr)
library(tidyr)
df %>%
   mutate(seqdat = map2(dmy(AufnDat), dmy(EntlDat), seq, by = 'day')) %>%
   unnest(c(seqdat))

【讨论】:

  • 完美。好于预期。我的下一步是计算每天的患者人数。我必须计算每天每个病房(站)躺着多少病人。现在很容易通过分组和计数来解决。谢谢
【解决方案2】:

除了@akruns 答案,我们可以将seqdat 存储为列表列表:

library(dplyr)
library(lubridate)
df_new <- df %>% 
  mutate(ID = row_number()) %>% 
  group_by(ID) %>% 
  mutate(seqdat = list(seq(from=dmy(AufnDat), to=dmy(EntlDat), by="day"))) %>%
  ungroup()

df_new 现在是:

df_new

 # A tibble: 10 x 6
 # Groups:   ID [10]
     PLZ AufnDat    EntlDat    Stat1    ID seqdat    
    <dbl> <chr>      <chr>      <chr> <int> <list>    
 1 67067 22.01.2020 23.01.2020 1A        1 <date [2]>
 2 74936 21.01.2020 23.01.2020 1A        2 <date [3]>
 3 97999 21.01.2020 27.01.2020 0A        3 <date [7]>
 4 76669 15.01.2020 17.01.2020 1         4 <date [3]>
 5 69126 07.01.2020 13.01.2020 0A        5 <date [7]>
 6 68753 13.01.2020 17.01.2020 1A        6 <date [5]>
 7 74928 23.01.2020 28.01.2020 2A        7 <date [6]>
 8 64720 10.01.2020 13.01.2020 1         8 <date [4]>
 9 48599 16.01.2020 22.01.2020 0A        9 <date [7]>
10 68723 07.01.2020 13.01.2020 0A       10 <date [7]>  

df_new$seqdat[1]

返回:

[[1]]
[1] "2020-01-22" "2020-01-23"

【讨论】:

    猜你喜欢
    • 2019-04-14
    • 1970-01-01
    • 2012-06-08
    • 2021-11-25
    • 2013-05-31
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多