首页 > 解决方案 > 根据另一列的条件在 R 中添加新列

问题描述

我有一个这样的data.frame:

Clinic    Month         Appointments
A         31-01-2019    0
A         28-02-2019    0
A         31-03-2019    3
A         30-04-2019    5
A         31-05-2019    0
A         30-06-2019    5 
B         31-01-2019    0
B         28-02-2019    5

而且我想添加一个名为Live_months自第一次约会以来的月数的新列,即使之后还有另一个月份有 0 个约会,例如:

Clinic    Month         Appointments      Live_months
A         31-01-2019    0                 0
A         28-02-2019    0                 0
A         31-03-2019    3                 1
A         30-04-2019    5                 2
A         31-05-2019    0                 3
A         30-06-2019    5                 4
B         31-01-2019    0                 0
B         28-02-2019    5                 1

我怎么能这样做?

标签: rdataframevariables

解决方案


您可以使用 :

library(dplyr)
library(lubridate)

df %>%
  mutate(Date = dmy(Month),
         year = year(Date), 
         Month = month(Date)) %>%
  arrange(Clinic, Date) %>%
  group_by(Clinic) %>%
  mutate(Live_months = {
    i <- which(Appointments > 0)[1]
    pmax((year - year[i]) * 12 + Month - Month[i] + 1, 0)
  })

#  Clinic Month Appointments Date        year Live_months
#  <chr>  <dbl>        <int> <date>     <dbl>       <dbl>
#1 A          1            0 2019-01-31  2019           0
#2 A          2            0 2019-02-28  2019           0
#3 A          3            3 2019-03-31  2019           1
#4 A          4            5 2019-04-30  2019           2
#5 A          5            0 2019-05-31  2019           3
#6 A          6            5 2019-06-30  2019           4
#7 B          1            0 2019-01-31  2019           0
#8 B          2            5 2019-02-28  2019           1 

数据

df <- structure(list(Clinic = c("A", "A", "A", "A", "A", "A", "B", 
"B"), Month = c("31-01-2019", "28-02-2019", "31-03-2019", "30-04-2019", 
"31-05-2019", "30-06-2019", "31-01-2019", "28-02-2019"), Appointments = c(0L, 
0L, 3L, 5L, 0L, 5L, 0L, 5L)), class = "data.frame", row.names = c(NA, -8L))

推荐阅读