【问题标题】:How to categorize a large integer vector efficiently in R如何在 R 中有效地对大整数向量进行分类
【发布时间】:2020-02-06 19:43:35
【问题描述】:

我有一个大整数向量(部分数据如下所示):

a <- c(0,0,0,1,1,2,2,2,4,4,7,7,7,35,50,50, 200,200,500,500,500, 2500,2501,2502,2502)

我想创建另一个向量(向量 b),将向量 a 的值分类到 bin 中。对于向量 a 值 0 - 6,类别值应为 1,对于 7 - 13,类别值应为 2,对于 14 - 20,类别值应为 3 ...

我知道我可以使用 dplyr case_when() 函数进行变异,但是当数据很大时它可能效率不高。

【问题讨论】:

  • 试试findInterval findInterval(a, c(6, 13, 20))
  • 我会尝试cut 看看是否也有效。 cut(a, c(-Inf, 0, 6, 13, 30, Inf), labels = FALSE)

标签: r categories


【解决方案1】:

将数值数据分类为具有数值输出值的范围的最佳方法是findInterval 函数。例子:

> a <- c(0,0,0,1,1,2,2,2,4,4,7,7,7,35,50,50, 200,200,500,500,500, 2500,2501,2502,2502)
> findInterval( a, c(0, 6, 12, 18, 24))
 [1] 1 1 1 1 1 1 1 1 1 1 2 2 2 5 5 5 5 5 5 5 5 5 5 5 5
> findInterval( a, 6^(0:6))
 [1] 0 0 0 1 1 1 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 5 5 5 5
> 6^(0:6)
[1]     1     6    36   216  1296  7776 46656

请注意,第二个参数中低于最小值的项目返回的值为 0,高于最大值的项目的值是vec(即中断)向量的长度。间隔是左闭右开,这与 cut 函数的行为方式相反(除非被参数更改)。

【讨论】:

  • 感谢您的快速回复!我知道我也可以使用 findInterval 但是当数据很大时,比如说以千计,列出截止点可能很耗时。我在考虑一个 for 循环,其中向量 a 的值从 0 开始,增量 i = 6,向量 b 从 1 开始,增量 j = 1,但我没有成功(我是 R 编程新手)。再次感谢。
  • 上面的第二个例子旨在展示如何使用 R 整数序列,尽管它创建了一个几何级数。也许您需要使用某个版本的seq 来计算算术级数,比如seq(from=0, to=10^7, by=6) 来提供vec(中断)值。但是,我不知道您的评论中应该包含什么 ab。在您的原始问题中,a 似乎是要分类的向量,而在评论中,它似乎是中断值。
  • 知道了,非常感谢!这解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 2018-03-03
  • 2016-07-31
  • 1970-01-01
  • 1970-01-01
  • 2016-11-18
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
相关资源
最近更新 更多