创建矢量列表与原始矢量长度相同的原始矢量的运行长度
问题描述:
这个问题看起来微不足道,但是我在读完小时之后就知道了这个问题。创建矢量列表与原始矢量长度相同的原始矢量的运行长度
我需要生成一个与输入向量长度相同的向量,该向量为输入向量的每个值列出该值的总计数。因此,通过举例的方式,我想生成该数据帧的最后一栏,或者通过使用第一列的运行长度,或分组第二列
> 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:
> tapply(df$transaction.count, df$customer.id, max)
和RLE:
> rle(df$customer.id)
但都返回长度较短的比原来的矢量:
[1] 4 2 3 1
任何帮助感激公认!
答
你可以不用与创建交易柜台:
df$total.transactions <- with(df,
ave(transaction.count , customer.id , FUN=length))
+0
在过去的几周里,我一直在使用不同的函数来代替长度,这真的非常有用 - 与其他一些实现相比,它的速度也非常快。我只希望我有足够的代表upvote!谢谢! –
答
您可能正在寻找拆分应用组合方法;必须在plyr包一看ddply
或split
功能基础R.
答
您可以使用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对象因此它只被调用一次。
或者正如卡斯滕建议用ddply
从plyr
:
require(plyr)
#Expects data.frame
dat <- data.frame(x = rep(1:4, 4:1))
ddply(dat, "x", transform, total = length(x))
感谢这么多优秀的答案!所有答案都很好用。 –