我有一个数据框,我想根据Category
返回每个PCC
的排名。
> head(newdf)
ItemId Category PCC
1 5063660193 Go to Gifts 2
2 24154563660193 Go to Gifts 1
2.1 24154563660193 All Gifts 1
3 26390063660193 Go to Gifts 3
3.1 26390063660193 All Gifts 3
4 18700100 Go to Gifts 1
我最初使用sqldf
包来做这件事,但不幸的是R版3.0.2无法使用依赖(tcltk
)。
使用sqldf
类似以下的调用应该完成这项工作:
# ranking by category
rank <- sqldf("select
nf.ItemId,
nf.Category,
nf.PCC,
rank() over(Partition by nf.Category order by nf.PCC, nf.ItemId, nf.Category) as Ranks
from
newdf as nf
order by
nf.Category,
nf.Ranks")
你知道我可以使用的其他选择吗?
答案 0 :(得分:2)
这些只是少数几种不同的方法:
dat <- read.table(text = " ItemId Category PCC
5063660193 'Go to Gifts' 2
24154563660193 'Go to Gifts' 1
24154563660193 'All Gifts' 1
26390063660193 'Go to Gifts' 3
26390063660193 'All Gifts' 3
18700100 'Go to Gifts' 1",header = TRUE,sep = "")
library(plyr)
ddply(dat,.(Category),transform, val = rank(PCC))
library(dplyr)
mutate(group_by(dat,Category),val = rank(PCC))
library(data.table)
dat1 <- data.table(dat)
setkey(dat1,Category)
dat1[,val := rank(PCC),by = key(dat1)]
另外,我可以在R 3.0.2上加载 sqldf 就好了,所以我不确定你的问题是什么。
这使用rank
的默认行为。请参阅?rank
和ties.method
参数,根据您的具体需求对其进行自定义。