【问题标题】:How can I make a counter for every country using a loop? R如何使用循环为每个国家/地区制作计数器? R
【发布时间】:2021-01-13 00:31:02
【问题描述】:

我认为这很容易,但我不知道该怎么做(或如何搜索)。

好的,我得到了很多国家/地区的 378 个观察结果。

事情是这样的

ISO3C       Date     Country    Vaccines Tests Confirmed Recovered Death Hospitalized Ventilation ICU
1   AFG 2020-01-01 Afghanistan        0     0         0         0     0            0           0   0
2   AFG 2020-01-02 Afghanistan        0     0         0         0     0            0           0   0
3   AFG 2020-01-03 Afghanistan        0     0         0         0     0            0           0   0
4   AFG 2020-01-04 Afghanistan        0     0         0         0     0            0           0   0
5   AFG 2020-01-05 Afghanistan        0     0         0         0     0            0           0   0

那么我如何设置一个计数器,从 2020 年 1 月 1 日到今天(2021 年 1 月 12 日)是 1,即第 1 天。 378,如果Country发生变化则重新开始

如果第一天不是 2020 年 1 月 1 日,但每个国家/地区都有自己的开始日期怎么办?

【问题讨论】:

  • 如果您的示例数据包含多个国家/地区,这将有所帮助。但是,如果您对每个国家都有完整的观察结果(378),那么就不需要按国家“重新开始”了吗?计数器只是日期 - 开始日期。请参阅@abdessabour-mtk 的答案。

标签: r dataframe loops


【解决方案1】:

实际上分组不会改变任何事情,但因为你想要它

df %>% group_by(ISO3C) %>% mutate(counter= Date - as.Date("01-01-2020"))

这会起作用

df %>% mutate(counter= Date - as.Date("01-01-2020"))

编辑

df %>% inner_join(df_origins) %>% mutate(counter= Date - Origin) %>% select(!Origin)

其中df_origins 具有列Country 和Origin

【讨论】:

  • 你可以放弃group_by
  • 是的,但是如果第一天不是 1 月 1 日怎么办?那我该如何设置计数器呢?每个国家都有自己的第一天(现在)。
  • 所以你有它在另一个data.frame你可以inner_join在国家然后从origin日期中减去日期
【解决方案2】:

您可以从每个国家/地区减去first(Date)。

library(dplyr)

df %>% 
  arrange(ISO3C, Date) %>%
  group_by(ISO3C) %>% 
  mutate(counter = Date - first(Date) + 1) -> result

result

【讨论】:

  • 该死的!你赢了。有效!谢谢!!
猜你喜欢
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
相关资源
最近更新 更多