基于多列返回下一次出现的值

时间:2015-10-15 11:47:26

标签: r

Bellow是一个DF,我想添加第四列" NextTime":

  Firm   Time  Date
1    A   8:00   1/1
2    B   9:00   1/1
3    A   9:30   1/1
4    B  10:00   1/1
5    B  11:00   1/1
6    B   8:00   1/2
7    C  10:00   1/2
8    C  10:30   1/2
9    C  10:35   1/2
10   B  10:55   1/2

NextTime列将是" next"时间,给定相同的公司和日期。对于公司和日期的最后一个值,应输入一个值(16:30),如下所示:

  Firm   Time  Date  NextTime
1    A   8:00   1/1      9:30
2    B   9:00   1/1     10:00
3    A   9:30   1/1     16:30
4    B  10:00   1/1     11:00
5    B  11:00   1/1     16:30
6    B   8:00   1/2     10:55 
7    C  10:00   1/2     10:30
8    C  10:30   1/2     10:35
9    C  10:35   1/2     16:30
10   B  10:55   1/2     16:30

尝试了匹配,动物园和申请的变体,将不胜感激。

2 个答案:

答案 0 :(得分:2)

我们可以使用data.table。我们将'data.frame'转换为'data.table'(setDT(df1)),按'Firm'和'Date'分组,我们使用type作为'Time'的'lead'和{ {1}}在fill函数中为'16:30'。

shift

或者使用library(data.table)#v1.9.6+ setDT(df1)[, NextTime:= shift(Time, type='lead', fill= '16:30'), .(Firm, Date)] df1 # Firm Time Date NextTime # 1: A 8:00 1/1 9:30 # 2: B 9:00 1/1 10:00 # 3: A 9:30 1/1 16:30 # 4: B 10:00 1/1 11:00 # 5: B 11:00 1/1 16:30 # 6: B 8:00 1/2 10:55 # 7: C 10:00 1/2 10:30 # 8: C 10:30 1/2 10:35 # 9: C 10:35 1/2 16:30 #10: B 10:55 1/2 16:30 ,我们按列进行分组并获取“时间”的dplyr来创建新列。

lead

答案 1 :(得分:0)

这是基础R解决方案。对于FirmDate ave的每个组合,返回下一个值或" 16:40" :

transform(DF, NextTime = ave(Time, Firm, Date, FUN = function(x) c(x[-1], "16:30")))

,并提供:

   Firm  Time Date NextTime
1     A  8:00  1/1     9:30
2     B  9:00  1/1    10:00
3     A  9:30  1/1    16:30
4     B 10:00  1/1    11:00
5     B 11:00  1/1    16:30
6     B  8:00  1/2    10:55
7     C 10:00  1/2    10:30
8     C 10:30  1/2    10:35
9     C 10:35  1/2    16:30
10    B 10:55  1/2    16:30

注意为了使其可重现(请在下次自己提供),我们使用了这个输入:

Lines <- "Firm   Time  Date
1    A   8:00   1/1
2    B   9:00   1/1
3    A   9:30   1/1
4    B  10:00   1/1
5    B  11:00   1/1
6    B   8:00   1/2
7    C  10:00   1/2
8    C  10:30   1/2
9    C  10:35   1/2
10   B  10:55   1/2"

DF <- read.table(text = Lines, header = TRUE, as.is = TRUE)