R:有条件地将数据从一个数据帧提取到另一个

标签 r loops vectorization

我有两个数据帧,我想有条件地从一个数据帧的一列中提取数据并将其放入另一个数据帧的新列中。
数据框 1 如下所示:

df1 <- data.frame(date.start = c("2019-06-10 11:52:00",
  "2019-06-11 11:52:00", "2019-06-12 11:51:00"), date.end =
  c("2019-06-10 11:53:00", "2019-06-11 11:53:00", "2019-06-12 11:53:00"))
数据框 2 如下所示:
df2 <- data.frame(date.start = c("2019-06-11 11:50:00",
  "2019-06-10 11:51:00", "2019-06-12 11:50:00"), date.end =
  c("2019-06-11 11:54:00", "2019-06-11 08:59:00", "2019-06-12 11:57:00"),
  day = c(1, 15, 64))
如果date.startdate.end df.1 属于 date.startdate.end df2 的任意行我想提取变量 day来自 df2并将其放入df1的匹配行中.
预期结果如下所示:
expected.out <- data.frame(date.start = c("2019-06-10 11:52:00", "2019-06-11 11:52:00", "2019-06-12 11:51:00"),
                           date.end = c("2019-06-10 11:53:00", "2019-06-11 11:53:00", "2019-06-12 11:53:00"),
                           day = c(15, 1, 64))
我目前有以下循环有效,但是当我在我的大数据帧(行 = 1135133)上运行它时它非常慢,我想知道是否有更快的方法来做到这一点。
for(i in 1:nrow(df1)){
  find.match <- which(df1$date.start[i] >= df2$date.start &
                        df1$date.end[i] <= df2$date.end)
  if(length(find.match) !=0){
    df1$day[i] <- df2$day[find.match]
  }
  
}

最佳答案

使用 library(fuzzyjoin)

library(tidyverse)
library(lubridate)
library(fuzzyjoin)

df1 <- data.frame(
  date.start = c("2019-06-10 11:52:00", "2019-06-11 11:52:00", "2019-06-12 11:51:00"),
  date.end = c("2019-06-10 11:53:00", "2019-06-11 11:53:00", "2019-06-12 11:53:00"), stringsAsFactors = F)

df2 <- data.frame(date.start = c("2019-06-11 11:50:00", "2019-06-10 11:51:00", "2019-06-12 11:50:00"),
                  date.end = c("2019-06-11 11:54:00", "2019-06-11 08:59:00", "2019-06-12 11:57:00"),
                  day = c(1, 15, 64), stringsAsFactors = F)

df1 <- df1 %>% 
  mutate(across(where(is.character), ymd_hms)) %>% 
  as_tibble()

df2 <- df2 %>% 
  mutate(across(where(is.character), ymd_hms)) %>% 
  as_tibble()


fuzzy_left_join(df1, df2, by = c("date.start", "date.end"), match_fun = list(`>=`, `<=`))
# A tibble: 3 x 5
  date.start.x        date.end.x          date.start.y        date.end.y            day
  <dttm>              <dttm>              <dttm>              <dttm>              <dbl>
1 2019-06-10 11:52:00 2019-06-10 11:53:00 2019-06-10 11:51:00 2019-06-11 08:59:00    15
2 2019-06-11 11:52:00 2019-06-11 11:53:00 2019-06-11 11:50:00 2019-06-11 11:54:00     1
3 2019-06-12 11:51:00 2019-06-12 11:53:00 2019-06-12 11:50:00 2019-06-12 11:57:00    64
创建于 2020-09-23 由 reprex package (v0.3.0)
不确定该方法是否快速

关于R:有条件地将数据从一个数据帧提取到另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64027958/

相关文章:

r - Shiny 的文件输入接受所有文件类型

python - R 相当于 Python 的 re.findall

r - 如何在支持自由类型的 R (Termux) 上安装 Cairo

python - 如何从 python 中的列表中提取某些值?

python - Pandas Series.apply() 没有按预期工作

arrays - 结构 : Fast assignment 的 Matlab 数组

c++ - rcpp 函数中的清理时间较长

R:从循环中打印单独的迭代?

c# - 虽然循环不工作只创建 3 个对象

matlab - 在 MATLAB 中找到矩阵的最大公约数