样本数据:

df1 <- data.frame(id=c("A","A","A","A","B","B","B","B"),
                        year=c(2014,2014,2015,2015),
                        month=c(1,2),
                        new.employee=c(4,6,2,6,23,2,5,34))

  id year month new.employee
1  A 2014     1            4
2  A 2014     2            6
3  A 2015     1            2
4  A 2015     2            6
5  B 2014     1           23
6  B 2014     2            2
7  B 2015     1            5
8  B 2015     2           34

期望的结果:
desired_df <- data.frame(id=c("A","A","A","A","B","B","B","B"),
                        year=c(2014,2014,2015,2015),
                        month=c(1,2),
                        new.employee=c(4,6,2,6,23,2,5,34),
                        new.employee.rank=c(1,1,2,2,2,2,1,1))

  id year month new.employee new.employee.rank
1  A 2014     1            4                 1
2  A 2014     2            6                 1
3  A 2015     1            2                 2
4  A 2015     2            6                 2
5  B 2014     1           23                 2
6  B 2014     2            2                 2
7  B 2015     1            5                 1
8  B 2015     2           34                 1

排名规则是:我选择每年的第 2 个月对 A 和 B 之间的新员工数量进行排名。然后我需要将这些排名给第 1 个月。即,每年第 1 个月的排名必须等于第 2 个月的排名同年。

我尝试了这些代码来获得每个月和每年的排名,
library(data.table)
df1 <- data.table(df1)
df1[,rank:=rank(new.employee), by=c("year","month")]

如果(任何人都可以滚动列中的排名值以将第 1 个月的排名替换为第 2 个月的排名),这可能是一个解决方案。

最佳答案

您已经尝试过 data.table 解决方案,下面是我将如何使用 data.table 执行此操作

library(data.table) # V1.9.6+
temp <- setDT(df1)[month == 2L, .(id, frank(-new.employee)), by = year]
df1[temp, new.employee.rank := i.V2, on = c("year", "id")]
df1
#    id year month new.employee new.employee.rank
# 1:  A 2014     1            4                 1
# 2:  A 2014     2            6                 1
# 3:  A 2015     1            2                 2
# 4:  A 2015     2            6                 2
# 5:  B 2014     1           23                 2
# 6:  B 2014     2            2                 2
# 7:  B 2015     1            5                 1
# 8:  B 2015     2           34                 1

它看起来有点类似于上面的 dplyr 解决方案。这基本上是每年对 id s 进行排名并将它们连接回原始数据集。我在这里使用 data.table V1.9.6+。

关于r - 选择一年中的一个月进行排名,然后将结果排名提供给其余年份,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33542688/

10-14 09:33