与 dplyr 组第一名的区别
difference from first in group with dplyr
我正在尝试使用 dplyr 创建一个 window 函数,它将 return 一个新向量,其中每个值与其组中的第一个值之间存在差异。
例如,给定此数据集:
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 值,减去 iterationNum=0 的 rf 值。
我尝试使用 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 崩溃并且 return 出现此错误消息:
pure virtual method called terminate called after throwing an instance
of 'Rcpp::exception' what(): incompatible size (%d), expecting %d
(the group size) or 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
如您所见,两者都为示例数据生成相同的输出。
我正在尝试使用 dplyr 创建一个 window 函数,它将 return 一个新向量,其中每个值与其组中的第一个值之间存在差异。 例如,给定此数据集:
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 值,减去 iterationNum=0 的 rf 值。
我尝试使用 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 崩溃并且 return 出现此错误消息:
pure virtual method called terminate called after throwing an instance of 'Rcpp::exception' what(): incompatible size (%d), expecting %d (the group size) or 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
如您所见,两者都为示例数据生成相同的输出。