【问题标题】:calculate a column with the order of a date in other column [duplicate]计算具有其他列中日期顺序的列[重复]
【发布时间】:2016-03-15 19:37:15
【问题描述】:

我想做一个简单的任务,不知道怎么做。 我有一个与此类似的数据框(实际上是 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

我想要一个新列,其中按 code1 的日期顺序如下:

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

提前致谢。

【问题讨论】:

  • [datatable] 还是 [data.table]?
  • 在基础 R 中,df$order <- unlist(lapply(split(df, df$code1), function(x){seq_along(x$date)}))
  • 由“data.table”包转换的数据框
  • unlist(tapply(df$date, df$code1, seq_along))
  • ...或者更好,以防它们不按顺序排列,unlist(tapply(df$date, df$code1, rank))

标签: r data.table


【解决方案1】:

使用data.table

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

【讨论】:

  • 这就是要找的东西。它在超过 1 亿行的数据框中表现得非常好。谢谢!
  • 从下个版本开始,也可以这样做:dt[, order := rowid(code1)]
【解决方案2】:

我们可以使用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 提到的,如果“日期”列未排序,我们可以使用arrangegroup_by 之后按“日期”排序,然后使用mutate 创建序列或使用rank

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 %&gt;% group_by(code1) %&gt;% mutate(order = rank(date))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多