【问题标题】:Group values by unique elements [duplicate]按唯一元素对值进行分组[重复]
【发布时间】:2016-08-28 15:13:06
【问题描述】:

我有一个看起来像这样的向量:

a <- c("A110","A110","A110","B220","B220","C330","D440","D440","D440","D440","D440","D440","E550")

我想创建另一个基于 a 的另一个向量,应该如下所示:

b <- c(1,1,1,2,2,2,3,4,4,4,4,4,4,5)

换句话说,b 应该为 a 的每个不同元素分配一个值(从 1 开始)。

【问题讨论】:

  • 为了修改原来的问题,我误改了。接受建议以使其变得更好。

标签: r


【解决方案1】:

首先,(我假设)这是你的向量

a <- c("A110","A110","A110","B220","B220","C330","D440","D440","D440","D440","D440","D440","E550")

根据可能的解决方案,这里有几个(现在找不到好的骗子)

as.integer(factor(a))
# [1] 1 1 1 2 2 3 4 4 4 4 4 4 5

或者

cumsum(!duplicated(a))
# [1] 1 1 1 2 2 3 4 4 4 4 4 4 5

或者

match(a, unique(a))
# [1] 1 1 1 2 2 3 4 4 4 4 4 4 5

rle 也将在您的特定场景中以类似方式工作

with(rle(a), rep(seq_along(values), lengths))
# [1] 1 1 1 2 2 3 4 4 4 4 4 4 5

或者(实际上是一样的)

data.table::rleid(a)
# [1] 1 1 1 2 2 3 4 4 4 4 4 4 5

虽然建议所有 4 种解决方案在不同场景下都有其独特的行为,但请考虑以下向量

a <- c("B110","B110","B110","A220","A220","C330","D440","D440","B110","B110","E550")

以及 4 种不同解决方案的结果:

1.

as.integer(factor(a))
# [1] 2 2 2 1 1 3 4 4 2 2 5

factor 解决方案以2 开头,因为a 未排序,因此integer 函数中的integer 表示中的第一个值越来越高。因此,此解决方案仅在您的向量已排序时才有效,因此请勿在其他方面使用它。

2.

cumsum(!duplicated(a))
# [1] 1 1 1 2 2 3 4 4 4 4 5

这个cumsum/duplicated 解决方案被混淆了,因为"B110" 在开始时已经存在,因此将"D440","D440","B110","B110" 分组到同一个组中。

3.

match(a, unique(a))
# [1] 1 1 1 2 2 3 4 4 1 1 5

这个match/unique 解决方案在最后添加了一个,因为它对"B110" 出现在多个序列中很敏感(因为unique),因此无论它们出现在哪里,都将它们全部分组到同一组中

4.

with(rle(a), rep(seq_along(values), lengths))
# [1] 1 1 1 2 2 3 4 4 5 5 6

这个解决方案只关心序列,因此"B110"的不同序列被分组到不同的组中

【讨论】:

  • 我的首选是match
  • @docendodiscimus 他们在不同的情况下表现不同。我正在考虑将这个答案扩展到几个场景
  • cumsum 更直观
  • 是的,这可能是有价值的信息
  • @docendodiscimus 添加了一些场景
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
  • 2017-11-20
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
相关资源
最近更新 更多