r - 如何根据日期差异对数据框进行子集化?
问题描述
我有两个数据框,我想对 df2 中的特定行进行子集化。这是df1和df2:
df1:
Sdate columnA D
2020-05-14 DD 1
2020-05-14 FF 5
2020-05-14 EE 6
2020-05-14 GG 7
df2:
Sdate ColA C
2020-04-13 NN 1
2020-04-13 XX 1
2020-04-14 VV 5
2020-04-15 DD 6
2020-04-16 AA 7
以下是获得最终输出的步骤:
- 我需要计算 df1 的 [1,1](即“2020-05-14”)和 df2 的 [1,1](即“2020-04-13”)之间的日期差异
- 我需要弄清楚差异是否大于 10 天。
- 最后,如果大于 10 天,我想删除 df2 中日期最早的行。因为 2020-04-13 是 df2 中最早的日期,所以我想删除 df2 的前两个低点。
“2020-05-14” - “2020-04-13” 是 31。因此,我的 df2 最终输出应该是
Sdate ColA C
2020-04-14 VV 5
2020-04-15 DD 6
2020-04-16 AA 7
我尝试使用以下代码:
df2 <- ifelse(as.numeric(as.Date(as.character(df1[1,1]), format="%Y-%m-%d")-
as.Date(as.character(df2[1,1]), format="%Y-%m-%d"))>10,
subset(df2, Sdate!= df2[1,1]),print("Pass"))
我将这段代码分成三部分分别测试,它们运行良好。但它不在上面的组合代码中。df2 与代码一起消失了。
我应该改变什么才能得到我想要的?
解决方案
您可以为此使用 dplyr。我提供了一种方法,您不需要比较第一行,但可以简单地取最小值。
library(dplyr)
new_df <- df2 %>%
mutate(
isOldest = Sdate == min(Sdate),
deleteOldest = as.integer(min(df1$Sdate) - min(Sdate)) > 10
) %>%
filter(!(isOldest & deleteOldest))
相反,如果您实际上只需要比较第一行:
new_df <- df2 %>%
mutate(
isOldest = Sdate == df2$Sdate[1],
deleteOldest = as.integer(df1$Sdate[1] - df2$Sdate[1]) > 10
) %>%
filter(!(isOldest & deleteOldest))
希望这是你需要的。下面的数据框。
df1 <- data.frame(
Sdate = as.Date('2020-05-14'),
columnA = c('DD', 'FF', 'EE', 'GG'),
D = c(1, 5, 6, 7),
stringsAsFactors = FALSE
)
df2 <- data.frame(
Sdate = as.Date(c(rep('2020-04-13', 2), '2020-04-14', '2020-04-15',' 2020-04-16')),
colA = c('NN', 'XX', 'VV', 'DD', 'AA'),
C = c(1, 1, 5, 6, 7),
stringsAsFactors = FALSE
)
推荐阅读
- angular - 使用加载器时,Openlayers 不会在图层中显示功能
- c - 从 linux 内核中的 bprm_check_security 获取 argv。文档有错吗?
- javascript - 如何使用 animxyz.css 在悬停时从右侧为淡入设置动画
- javascript - Onclick 事件问题
- python - 尝试检测网站 selenium 上是否显示错误时出错
- c# - 有没有办法通过代码从 OpenFileDialog 设置文件名?
- webpack - 将 webpack 和 mocha 与 ES6 模块一起使用
- python - Python 游标通知 postgres 重置
- if-statement - pl / sql中的if else条件查询许多流程条件
- bash - 在 crontab 上创建一个流编辑器的命令并每 15 分钟重写一个文件