【问题标题】:Create a vector listing run length of original vector with same length as original vector创建一个向量列出与原始向量相同长度的原始向量的游程长度
【发布时间】:2011-08-28 22:36:55
【问题描述】:

这个问题似乎微不足道,但经过几个小时的阅读,我已经束手无策了。

我需要生成一个与输入向量长度相同的向量,为输入向量的每个值列出该值的总计数。所以,举例来说,我想生成这个数据框的最后一列:

> 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(df$customer.id)

但两者都返回一个比原始长度更短的向量:

[1] 4  2  3  1

感激地接受任何帮助!

【问题讨论】:

  • 非常感谢您的出色回答!所有答案都很好用。

标签: r


【解决方案1】:

您可以在不创建事务计数器的情况下这样做:

df$total.transactions <- with( df,  
                     ave( transaction.count , customer.id , FUN=length) )

【讨论】:

  • 在过去的几周里,我一直在使用不同的函数来代替长度,它确实非常有用 - 与其他一些实现相比也非常快。我只希望我有足够的代表来投票!谢谢!
【解决方案2】:

您可以使用rlerep 来获得您想要的:

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 from plyr:

require(plyr)

#Expects data.frame
dat <- data.frame(x = rep(1:4, 4:1))
ddply(dat, "x", transform, total = length(x))

【讨论】:

    【解决方案3】:

    您可能正在寻找拆分应用组合方法;查看 plyr 包中的 ddply 或基础 R 中的 split 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-11
      • 1970-01-01
      相关资源
      最近更新 更多