【问题标题】:How to create a counter/numeration by group? [duplicate]如何按组创建计数器/计数? [复制]
【发布时间】:2011-12-22 13:29:52
【问题描述】:

我有一些如下形状的数据:

更新:我的数据有一个我想分组的额外变量。我将 ddply 与 Richie 提供的以下解决方案一起使用,但没有奏效。

Country,group, date
US,A,'2011-10-01'
US,B,'2011-10-01'
US,C,'2011-10-01'
MX,D,'2011-10-01'
UK,E,'2011-10-02'
UK,B,'2011-10-02'
UK,A,'2011-10-02'
UK,C,'2011-10-02'

数据框已经排序,所以 A 排在第一位,B 排在第二位,以此类推。我要创建的是按日期排列的排名变量,如下所示:

Country,group, date,rank
US,A,'2011-10-01',1
US,B,'2011-10-01',2
US,C,'2011-10-01',3
MX,D,'2011-10-01',1
UK,E,'2011-10-02',1
UK,B,'2011-10-02',2
UK,A,'2011-10-02',3
UK,C,'2011-10-02',4
    ....

【问题讨论】:

  • 对不起,我不同意——我在 2011 年问过这个问题,并在 2011 年得到了答案,你建议的答案是今年的答案!奇怪的是你@procrastinatus-maximus - 有点方便
  • 确实,我今年添加了一个答案,目的是添加比这个问题更早的现有答案。令我惊讶的是,OP 将接受的答案更改为我的。因此,它是一个有效的重复 imo。

标签: r aggregate


【解决方案1】:

首先,使用class(your_dataset$date) 检查您的日期是否真的是日期格式(不是factor)。如果没有,请使用lubridate 中的ymd 进行转换。

其次,使用rank获取排名。 (比你想象的要容易,对吧!)

your_dataset$rank

您可能想探索几种不同的打破关系的方法。

重读您的问题后,我发现您不想对日期进行排名,而是希望在日期内有一个计数器。为此,首先检查您的数据集是否按日期排序。

o <- with(your_dataset, order(date))
your_dataset <- your_dataset[o, ]

然后在每个日期块上调用seq_len。

counts <- as.numeric(table(your_dataset$date))
your_dataset$rank <- unlist(lapply(counts, seq_len))

【讨论】:

  • 感谢提示 - 我删除了我的答案。如果需要进一步澄清,奥尔顿肯定会发表评论。
  • 这是有效的,但是我以错误的方式提出了我的问题!查看更新。
  • 我需要通过 2 个变量来创建排名,而不是像我最初在问题中所说的那样。对不起,痛苦
  • 最简单的解决方法是创建一个新因子:within(your_dataset, group &lt;- paste(Country, date))。然后在我上面的解决方案中用group替换date。
  • 太棒了!现在就像一个魅力!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
相关资源
最近更新 更多