r语言 - 与 DPLYR 组中的第一名不同



>我正在尝试使用 dplyr 创建一个窗口函数,它将返回一个新向量,其中包含每个值与其组的第一个值之间的差异。例如,给定此数据集:

dummy <- data.frame(userId=rep(1,6),
     libId=rep(999,6),
     curatorId=c(1:2,1:2,1:2),
     iterationNum=c(0,0,1,1,2,2),
     rf=c(5,10,0,15,30,40)
)

这将创建此数据集:

  userId libId curatorId iterationNum rf
1      1   999         1            0  5
2      1   999         2            0 10
3      1   999         1            1  0
4      1   999         2            1 15
5      1   999         1            2 30
6      1   999         2            2 40

并给定此分组:

 dummy<-group_by(dummy,libId,userId,curatorId)

会给出这个结果:

  userId libId curatorId iterationNum   rf   rf.diff
1      1   999         1            0  5    0
2      1   999         2            0 10    0
3      1   999         1            1  0   -5
4      1   999         2            1 15   -5
5      1   999         1            2 30    25
6      1   999         2            2 40    30

因此,对于每组用户、库和策展人,我将得到 rf 值,减去 rf 值,迭代 Num=0。我尝试使用first函数、rank 函数和其他函数,但找不到固定的方法。

---编辑---

这是我尝试过的:

dummy %>% 
  group_by(userId,libId,curatorId) %>% 
  mutate(rf.diff = rf - subset(dummy,iterationNum==0)[['rf']])

和:

dummy %>% 
  group_by(userId,libId,curatorId) %>% 
  mutate(rf.diff = rf - first(x = rf,order_by=iterationNum))

这会使 R 崩溃并返回以下错误消息:

抛出实例后调用的称为终止的纯虚拟方法 的 'Rcpp::exception' what(): 不兼容的大小 (%d), 期望 %d (团体人数)或 1'

我上面评论的两种方法如下。

dummy %>%
  group_by(libId, userId, curatorId) %>%
  mutate(rf.diff = rf - rf[iterationNum == 0])
#Source: local data frame [6 x 6]
#Groups: libId, userId, curatorId
#
#  userId libId curatorId iterationNum rf rf.diff
#1      1   999         1            0  5       0
#2      1   999         2            0 10       0
#3      1   999         1            1  0      -5
#4      1   999         2            1 15       5
#5      1   999         1            2 30      25
#6      1   999         2            2 40      30

或者使用 arrange 按 iterationNum 对数据进行排序:

dummy %>%
  arrange(iterationNum) %>%
  group_by(libId, userId, curatorId) %>%
  mutate(rf.diff = rf - first(rf))
#Source: local data frame [6 x 6]
#Groups: libId, userId, curatorId
#
#  userId libId curatorId iterationNum rf rf.diff
#1      1   999         1            0  5       0
#2      1   999         2            0 10       0
#3      1   999         1            1  0      -5
#4      1   999         2            1 15       5
#5      1   999         1            2 30      25
#6      1   999         2            2 40      30

如您所见,两者为示例数据生成相同的输出。

最新更新