【问题标题】:FOR Loop with multiple parameters from a dataframe in R [closed]具有来自 R 中的数据帧的多个参数的 FOR 循环 [关闭]
【发布时间】:2020-10-27 12:39:39
【问题描述】:

我想知道是否可以在 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 中可能吗? 非常感谢您的任何建议。

【问题讨论】:

  • 是的,您可以获得与参数中的某些条件匹配的单个行。您是否需要根据个人的某些值在 df 中创建一个新列?
  • 嗨,我需要创建一个只包含选定行的新数据框。
  • 好的,是的。听起来你想做一个merge()union(),它们是数据库类型的函数,你可以在其中获取 2 个数据集并根据匹配条件 join 它们。您需要在行上匹配什么标准?然后你告诉函数你希望它如何匹配

标签: r dataframe date lubridate


【解决方案1】:

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

我不知道您的日期变量是否已经是日期格式;下面我用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 在上述区间

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)

【讨论】:

  • 嗨,谢谢。效果很好!
猜你喜欢
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 2022-01-16
  • 2018-04-26
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
相关资源
最近更新 更多