这个问题似乎微不足道,但是经过几个小时的阅读后,我的智慧才结束。
我需要生成一个与输入向量长度相同的向量,该向量列出输入向量的每个值,该值的总计数。因此,举例来说,我想生成此数据帧的最后一列:
> df
customer.id transaction.count total.transactions
1 1 1 4
2 1 2 4
3 1 3 4
4 1 4 4
5 2 1 2
6 2 2 2
7 3 1 3
8 3 2 3
9 3 3 3
10 4 1 1
我意识到这可以通过两种方式完成,或者使用第一列的运行长度,或者使用第一列对第二列进行分组并应用最大值。
我尝试了两个:
> tapply(df$transaction.count, df$customer.id, max)
并且:rle:
> rle(df$customer.id)
但两者都返回一个比原始长度更短的向量:
[1] 4 2 3 1
感激地接受了任何帮助!
答案 0 :(得分:6)
您可以在不创建事务计数器的情况下执行此操作:
df$total.transactions <- with( df,
ave( transaction.count , customer.id , FUN=length) )
答案 1 :(得分:1)
您可以rle
与rep
一起使用,以获得您想要的内容:
x <- rep(1:4, 4:1)
> x
[1] 1 1 1 1 2 2 2 3 3 4
rep(rle(x)$lengths, rle(x)$lengths)
> rep(rle(x)$lengths, rle(x)$lengths)
[1] 4 4 4 4 3 3 3 2 2 1
出于性能目的,您可以单独存储rle对象,因此只调用一次。
或者正如Karsten从ddply
plyr
提出的建议:
require(plyr)
#Expects data.frame
dat <- data.frame(x = rep(1:4, 4:1))
ddply(dat, "x", transform, total = length(x))
答案 2 :(得分:0)
你可能正在寻找分裂 - 应用 - 组合方法;查看plyr包中的ddply
或基础R中的split
函数。