我有一个巨大的数据集,我想根据一组条件插入一个虚拟变量列:
我有我的主 df (A),其中有 500 万行和 10 列,其中 4 个是日期、小时、分钟、秒,这些数据从 2020 年到 2023 年。
在另一个 df (B) 上,我有相同的列,但只有 30 行。
我希望 A 查看 B,并将日期、小时、分钟、秒与 B 的日期、小时、分钟、秒匹配的所有行放入 1,其余所有行放入 0。所以,最后,我应该找到自己的专栏,其中有 30
1
和 4.999.970 0
更好的是日期、小时、分钟完全匹配,秒匹配“或多或少”(比如+/- 5秒)
你能帮忙吗?
我认为解决方案可能是:
A$dummy <- for (i in A){
ifelse("A$date"=="B$date"&"A$hour"=="B$hour"&
"A$minute"=="B$minute"&or("A$second">="B$second"-5,"A$second"<="B$second"+5),1,0)
}
我认为你可以使用
dplyr
和 lubridate
函数。试试这个:
## load the libraries
library(lubridate)
library(dplyr)
## create df A
dfA <- data.frame(
date = seq(as.Date("2023-08-25"), by = "days", length.out = 100),
sym = rep("EUR_ab6m_05y", 100),
hour = sprintf("%02d", rep(0:23, length.out = 100)),
minute = sprintf("%02d", rep(0:59, length.out = 100)),
second = sprintf("%02d", rep(0:59, length.out = 100))
)
## create data.frame B (just a selected part of df A)
dfB <- dfA[c(1:10), ]
## Transform variables to datetime
dfA %>%
mutate(new_date = str_glue('{date} {hour}:{minute}:{second}') %>% ymd_hms()) -> dfA
dfB %>%
mutate(new_date = str_glue('{date} {hour}:{minute}:{second}') %>% ymd_hms()) -> dfB
dfB$new_date -> list_dates
## Verify the condition
dfA %>%
mutate(dummy = ifelse(new_date %in% list_dates, 1, 0)) -> dfA
代码的大部分是创建 df。