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
尝试了匹配,动物园和申请的变体,将不胜感激。
答案 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解决方案。对于Firm
和Date
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)