繁体   English   中英

使用 for 循环和 dplyr

[英]using for loops and dplyr

所以我有一个名为 Swine_flu_cases 的数据框,它看起来如下(只是一个摘录):

 Swine_flu_cases <- read.table(text = "Country    Date        Confirmed     
1   Egypt   2020-01-22         0                            
2   Egypt   2020-01-23         1                                
3   Algeria 2020-01-24         1                                
4   France  2020-01-25         1                                
5   Zambia  2020-01-26         1                            
6   Congo   2020-01-27         1", header =TRUE)      

我想创建一个名为“days_since_first_case”的新变量,它应该是一个数字向量,它将从该国首次确诊猪流感病例时减去当前日期。

这是我用来创建新变量的代码:

Swine_flu_cases %>% 
filter(Confirmed ==1) %>%
group_by(Country) %>% 
mutate(days_since_first_case = Date - min(Date))  

这段代码的问题是它只给我确认等于 1 的行并采用该最小日期,如果我删除过滤器,它只需要国家的最小日期并从中减去每个日期。

我不知道我是否应该为此添加一个 for 循环,我不熟悉 for 循环就是我选择使用这种方法的原因。

任何帮助或建议将不胜感激。

我建议这种方法重用你的一些代码:

library(dplyr)
#Format
Swine_flu_cases %>% mutate(Date=as.Date(Date)) -> Swine_flu_cases
#Code
Swine_flu_cases %>%
  left_join(Swine_flu_cases %>% 
              filter(Confirmed ==1) %>%
              group_by(Country) %>% 
              summarise(DateFirstCase = min(Date))) %>%
  mutate(DaysSinceFirstCase=DateFirstCase-Date)

输出:

  Country       Date Confirmed DateFirstCase DaysSinceFirstCase
1   Egypt 2020-01-22         0    2020-01-23             1 days
2   Egypt 2020-01-23         1    2020-01-23             0 days
3 Algeria 2020-01-24         1    2020-01-24             0 days
4  France 2020-01-25         1    2020-01-25             0 days
5  Zambia 2020-01-26         1    2020-01-26             0 days
6   Congo 2020-01-27         1    2020-01-27             0 days

请让我知道这是否是您想要的,因为我也对您想要的输出感到困惑。

不需要 for 循环。 您可以轻松使用您拥有的代码,但日期仅在有案例时显示:

Swine_flu_cases %>%
  group_by(Country) %>% 
  mutate(
    case_date = ifelse(Confirmed == 1, Date, NA),
    days_since_first_case = Date - min(case_date)
  ) %>%
  ungroup()

这是一种获取自某个国家首次发现病例以来的天数的方法。 我认为 Confirmed 是案例数,因此我过滤了一个或多个案例。 为了测试,我更改了您的示例代码,并为埃及制作了更多案例和天数。

library(lubridate)

Swine_flu_cases <- read.table(text = "Country    Date        Confirmed     
1   Egypt   2020-01-22         0                            
2   Egypt   2020-01-23         1                                
3   Egypt   2020-01-24         5                                
4   Egypt   2020-01-25         7                                
5   Zambia  2020-01-26         1                            
6   Congo   2020-01-27         1", header =TRUE)  


Swine_flu_cases %>%
  mutate(Date = ymd(Date)) %>% 
  filter(Confirmed >= 1) %>%
  group_by(Country) %>% 
  mutate(days_since_first_case = as.numeric(difftime(Date, min(Date), units = "days")))  %>%
  ungroup()

# A tibble: 5 x 4
  Country Date       Confirmed days_since_first_case
  <chr>   <date>         <int>                 <dbl>
1 Egypt   2020-01-23         1                     0
2 Egypt   2020-01-24         5                     1
3 Egypt   2020-01-25         7                     2
4 Zambia  2020-01-26         1                     0
5 Congo   2020-01-27         1                     0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM