我的交易数据集包含多个变量,包括ID号,日期和交易区域(因子):
id<-as.integer(rep(c(1,2,3,4,5),times=20))
date<-rep(seq(as.Date("2011-07-01"),by="day", length.out=100))
category<-rep(as.factor(letters[seq( from = 1, to = 4 )]),times=25)
transactions<-data.frame(id, date, category)
head(transactions)
id date category
1 2011-07-01 a
2 2011-07-02 b
3 2011-07-03 c
4 2011-07-04 d
5 2011-07-05 a
1 2011-07-06 b
我希望在每个ID的基础上确定因子外观的顺序,而不重述已经出现的因素。
solution <- transactions %>%
group_by(id, date)%>%
mutate(category_order= (solution))
所以我可以得到:
head(transactions)
id date category category_order
1 2011-07-01 a 1
1 2011-07-06 b 2
1 2011-07-11 c 3
1 2011-07-16 d 4
1 2011-07-21 a 1
1 2011-07-26 b 2
对于每个ID,如果类别重复,则它必须具有相同的订单值。在上面的示例中,a始终为1st,b始终为2nd,等等。
我想要做的是计算每个类别是第1,第2,第3等的次数,以获得a次为1次,b为1次,a为第2次等的频率分布:
head(transactions)
category category_ order category_order_count
a 1 5
a 2 3
a 3 5
a 4 4
b 1 5
b 2 2
这可能并不复杂,但我有精神障碍,因为它主要涉及计算每个ID的订单而不重复因子级别,然后按ID进行汇总,最后总结每个类别。
答案 0 :(得分:1)
在每个ID中,您可以将因子的级别设置为它们在该组中出现的顺序,然后通过as.numeric
将因子转换为整数以形成新变量。这取决于数据集的顺序,因此,如果事情不符合要求,则应{id}和id arrange
。
transactions %>%
arrange(id, date) %>%
group_by(id) %>%
mutate(category_order = as.numeric(factor(category, levels = unique(category))))
答案 1 :(得分:1)
这也可以使用data.table
完成。我们转换了&#39; data.frame&#39;到&#39; data.table&#39; (setDT(transactions)
),按&#39; id&#39;分组,指定&#39; i&#39;部分order
的&#39; id&#39;和&#39; date&#39;,转换&#39;类别&#39;通过将factor
指定为&#39;类别&#39;中的levels
元素,将其强制转换为unique
,并将其强制转换为&#39;整数&#39;并将(:=
)输出分配给&#39; category_order&#39;
library(data.table)
setDT(transactions)[order(id, date), category_order := as.integer(factor(category,
levels = unique(category))) , by = id]
head(transactions)
# id date category category_order
#1: 1 2011-07-01 a 1
#2: 2 2011-07-02 b 1
#3: 3 2011-07-03 c 1
#4: 4 2011-07-04 d 1
#5: 5 2011-07-05 a 1
#6: 1 2011-07-06 b 2