具有来自 R 中数据帧的多个参数的 FOR 循环

FOR Loop with multiple parameters from a dataframe in R

我想知道是否可以在 R 中构建一个 FOR 循环,它会在每个 运行.

更改多个参数

我有参数数据框 [df_params],它看起来像这样:

group   person   date_from             date_to
1        Mike    2020-10-01 12:00:00   2020-10-01 13:00:00
2        Mike    2020-10-04 09:00:00   2020-10-07 17:00:00
3        Dave    2020-10-07 12:00:00   2020-10-07 13:00:00
4        Dave    2020-10-09 09:00:00   2020-10-11 17:00:00

我想遍历一个更大的数据帧 [df] 并只获取与“df_params”数据帧中各行参数匹配的行。

大数据框 [df] 如下所示:

person    datetime              books  tasks  done
Mike      2020-10-01 12:15:00   5      7      2 
Mike      2020-10-01 12:17:00   5      7      3 
Mike      2020-10-01 18:00:00   5      7      4 
Mike      2020-10-02 12:00:00   5      5      0 
Mike      2020-10-04 09:08:00   5      3      3 
Mike      2020-10-09 12:00:00   5      7      1 
Dave      2020-10-07 12:22:00   7      5      1 
Dave      2020-10-08 02:34:00   7      5      2 
Dave      2020-10-09 07:00:00   7      3      3 
Dave      2020-10-09 08:00:00   7      8      5 
Dave      2020-10-09 09:48:00   7      7      2 
Nick      2020-10-01 13:00:00   3      7      3 
Nick      2020-10-02 12:58:00   3      3      2 
Nick      2020-10-03 10:02:00   3      7      1 

期望的结果如下所示:

person    datetime              books  tasks  done   group
Mike      2020-10-01 12:15:00   5      7      2      1
Mike      2020-10-01 12:17:00   5      7      3      1
Mike      2020-10-04 09:08:00   5      3      3      2
Dave      2020-10-07 12:22:00   7      5      1      3
Dave      2020-10-09 09:48:00   7      7      2      4

在 R 中可以实现这样的功能吗? 非常感谢您的任何建议。

如果您的数据集非常大,这可能是一个稍微昂贵的解决方案,但它会输出所需的结果。

不知道你的日期变量是否已经是日期格式了;下面我用 lubridate 包转换它们,以防它们不是。
此外,我创建了变量 date_interval,稍后将用于过滤条件。

library(dplyr)
library(lubridate)

# convert to date format
df_params <- df_params %>% 
  mutate(
    date_from = ymd_hms(date_from),
    date_to = ymd_hms(date_to),
    # create interval
    date_interval = interval(date_from, date_to)
    )

df <- df %>% 
  mutate(datetime = ymd_hms(datetime))

在这个操作步骤之后,我在人名上使用 left_join 以获得更大的数据框 - 因此我之前说过这个操作可能有点昂贵 - 然后 filter 只有 datetime above-mentioned 间隔内的行。

left_join(df, df_params, by = "person") %>% 
  filter(datetime %within% date_interval) %>% 
  select(person:group)
#   person            datetime books tasks done group
# 1   Mike 2020-10-01 12:15:00     5     7    2     1
# 2   Mike 2020-10-01 12:17:00     5     7    3     1
# 3   Mike 2020-10-04 09:08:00     5     3    3     2
# 4   Dave 2020-10-07 12:22:00     7     5    1     3
# 5   Dave 2020-10-09 09:48:00     7     7    2     4

起始数据

df_params <- read.table(text="
group    person  date_from             date_to
1        Mike    2020-10-01T12:00:00   2020-10-01T13:00:00
2        Mike    2020-10-04T09:00:00   2020-10-07T17:00:00
3        Dave    2020-10-07T12:00:00   2020-10-07T13:00:00
4        Dave    2020-10-09T09:00:00   2020-10-11T17:00:00", header=T)

df <- read.table(text="
person    datetime              books  tasks  done
Mike      2020-10-01T12:15:00   5      7      2 
Mike      2020-10-01T12:17:00   5      7      3 
Mike      2020-10-01T18:00:00   5      7      4 
Mike      2020-10-02T12:00:00   5      5      0 
Mike      2020-10-04T09:08:00   5      3      3 
Mike      2020-10-09T12:00:00   5      7      1 
Dave      2020-10-07T12:22:00   7      5      1 
Dave      2020-10-08T02:34:00   7      5      2 
Dave      2020-10-09T07:00:00   7      3      3 
Dave      2020-10-09T08:00:00   7      8      5 
Dave      2020-10-09T09:48:00   7      7      2 
Nick      2020-10-01T13:00:00   3      7      3 
Nick      2020-10-02T12:58:00   3      3      2 
Nick      2020-10-03T10:02:00   3      7      1 ", header=T)