r - 通过加入 R 进行条件分组

标签 r join conditional-statements

我是 R 新手,对以下问题感到相当困惑。我有两个日期向量(向量不一定对齐,也不一定具有相同的长度)。

我想为第一个向量中的每个日期查找第二个向量中的下一个日期。

vecA <- as.Date(c('1951-07-01', '1953-01-01', '1957-04-01', '1958-12-01',
       '1963-06-01', '1965-05-01'))
vecB <- as.Date(c('1952-01-12', '1952-02-01', '1954-03-01', '1958-08-01', 
           '1959-03-01', '1964-03-01', '1966-05-01'))

在 SQL 中我会写这样的东西,但是我在 SO 中找不到任何关于如何在 R 中执行此操作的提示。

 select vecA.Date, min(vecB.Date)
       from vecA inner join vecB
       on vecA.Date < vecB.Date
       group by vecA.Date

输出应如下所示:

Start      End
1951-07-01 1952-01-12
1953-01-01 1954-03-01
1957-04-01 1958-08-01
1958-12-01 1959-03-01
1963-06-01 1964-03-01
1965-05-01 1966-05-01

最佳答案

这是使用data.table滚动连接的可能解决方案

library(data.table)
dt1 <- as.data.table(vecA) ## convert to `data.table` object
dt2 <- as.data.table(vecB) ## convert to `data.table` object
setkey(dt2) # key in order to perform a binary join
res <- dt2[dt1, vecB, roll = -Inf, by = .EACHI] # run the inner join while selecting closest date 
setnames(res, c("Start", "End"))
res
#         Start        End
# 1: 1951-07-01 1952-01-12
# 2: 1953-01-01 1954-03-01
# 3: 1957-04-01 1958-08-01
# 4: 1958-12-01 1959-03-01
# 5: 1963-06-01 1964-03-01
# 6: 1965-05-01 1966-05-01

或者,我们也可以这样做:

data.table(vecA=vecB, vecB, key="vecA")[dt1, roll=-Inf]

关于r - 通过加入 R 进行条件分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30646634/

相关文章:

r - 找到相反的条件(使用 R tidyverse)以便将数据集分割为 2

mysql - 在 mysql 中使用来自多个表的连接时,更新查询性能不佳

multithreading - 在Perl中,当运行使用open fork 的另一个子进程时,我无法加入线程

javascript - JavaScript 三元运算符表达式中的 Return 语句

r - 使用 curve() 时的函数表达式 R 问题

r - 如何在 R 中查找和替换具有舍入值的文本中的数字?

r - 避免 "Could not resolve host"错误以停止 R 中的程序运行

使用多列的 SQL Server 连接

php - 如何在 yii find() 中输入条件?

c++ - 如何优化长系列的 If/then 条件表达式 - SIMD