我在数据框中有以下变量:
App.Date App.No.
01/01/2012 A0001
01/01/2012 A0082
01/01/2012 F0003
02/01/2012 A0004
02/01/2012 A0055
03/01/2012 P0006
03/01/2012 A0007
03/01/2012 A0008
03/01/2012 A0009
......... ......
我想创建一个跟踪每个日期排序的变量 输出将是另一个变量,它将在每次日期变化时排序和开始
App.Date App.No. Seq
01/01/2012 A0001 1
01/01/2012 A0082 2
01/01/2012 F0003 3
02/01/2012 A0004 1
02/01/2012 A0055 2
03/01/2012 P0006 1
03/01/2012 A0007 2
03/01/2012 A0008 3
03/01/2012 A0009 4
......... ...... .
如何在没有for循环的情况下在R中执行此操作?有超过10万行,必须在每次更改日期时创建一个系列。
答案 0 :(得分:1)
您可以dplyr
使用mutate
功能创建一个新列,该列将是1
到每个日期组中行数的向量:
library(dplyr)
df <- df %>% group_by(App.Date) %>% mutate(seq = 1:n())
df
# Source: local data frame [9 x 3]
# Groups: App.Date [3]
# App.Date App.No. seq
# <fctr> <fctr> <int>
# 1 01/01/2012 A0001 1
# 2 01/01/2012 A0082 2
# 3 01/01/2012 F0003 3
# 4 02/01/2012 A0004 1
# 5 02/01/2012 A0055 2
# 6 03/01/2012 P0006 1
# 7 03/01/2012 A0007 2
# 8 03/01/2012 A0008 3
# 9 03/01/2012 A0009 4
或者使用ave
对按cumsum
分组的序列进行App.Date
:
df$Seq <- ave(rep(1, nrow(df)), df$App.Date, FUN = cumsum)
df$Seq
# [1] 1 2 3 1 2 1 2 3 4
当您熟悉data.table
包时:
library(data.table)
setDT(df)
df[, Seq := 1:.N, .(App.Date)]