Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 按其他列中日期的顺序计算列_R_Data.table - Fatal编程技术网

R 按其他列中日期的顺序计算列

R 按其他列中日期的顺序计算列,r,data.table,R,Data.table,我想做一个简单的任务,但不知道如何做。 我有一个数据帧(实际上是data.table),类似于: date code1 2015-03-01 A 2015-03-02 A 2015-03-03 A 2015-03-01 B 2015-03-02 B 2015-03-03 B 我想要一个新的列,日期顺序按代码1排列,如下所示: date code1 order 2015-03-01 A 1

我想做一个简单的任务,但不知道如何做。 我有一个数据帧(实际上是data.table),类似于:

date         code1 
2015-03-01     A
2015-03-02     A
2015-03-03     A
2015-03-01     B
2015-03-02     B
2015-03-03     B
我想要一个新的列,日期顺序按代码1排列,如下所示:

date         code1   order
2015-03-01     A       1
2015-03-02     A       2
2015-03-03     A       3
2015-03-01     B       1
2015-03-02     B       2
2015-03-03     B       3

提前感谢。

使用
数据。表

dt[, order := seq(.N), by = code1]

> dt
#         date code1 order
#1: 2015-03-01     A     1
#2: 2015-03-02     A     2
#3: 2015-03-03     A     3
#4: 2015-03-01     B     1
#5: 2015-03-02     B     2
#6: 2015-03-03     B     3

我们可以使用
dplyr

library(dplyr)
df %>%
   group_by(code1) %>%
   mutate(Order = row_number())
   date code1 Order
#      (chr) (chr) (int)
#1 2015-03-01     A     1
#2 2015-03-02     A     2
#3 2015-03-03     A     3
#4 2015-03-01     B     1
#5 2015-03-02     B     2
#6 2015-03-03     B     3
正如@alistaire所提到的,如果“日期”列没有排序,我们可以使用
排列
分组_by
后按“日期”排序,然后使用
mutate
或使用
创建序列

df %>% 
  group_by(code1) %>% 
  mutate(Order = rank(date))

或者使用
splitstackshape

library(splitstackshape)
getanID(df, 'code1')[]

或使用
base R

df$Order <- with(df, ave(seq_along(code1), code1, FUN= seq_along)) 

df$Order[datatable]或[data.table]?在base R中,由“data.table”包转换的
df$Order数据帧
unlist(tapply(df$date,df$code1,seq_-along))
…或更好,如果它们不在顺序中,
取消列表(tapply(df$date,df$code1,rank))
,如果它们不在顺序中,做
df%>%groupby(code1)%>%mutate(order=rank(date))可能更安全些。
这就是我们要找的。它在超过1亿行的数据帧中表现得非常好。谢谢在下一个版本中,还可以执行以下操作:
dt[,order:=rowid(code1)]