每当数据中出现n个唯一水平时,将因素分组

4

每当有5个唯一的级别时,我希望获得一个新的分组。

例如,varB是所需结果。

structure(list(varA = structure(c(2L, 2L, 3L, 5L, 4L, 1L, 1L, 
2L, 3L, 5L, 4L, 4L, 1L), .Label = c("badger", "cat", "dog", "monkey", 
"turtle"), class = "factor"), varB = c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L)), .Names = c("varA", "varB"), class = "data.frame", row.names = c(NA, 
-13L))

编辑: 关于数据的一些假设:

  • 级别会在数据后重复出现
  • 新的级别会在数据后出现
  • 数据中没有固定的顺序

起始级别总是相同的吗?(例如,在这种情况下是“cat”)。 - A5C1D2H2I1M1N2O1R2T1
@mrdwab 在看到你的帖子之前,我正在编辑描述。没有固定的“起始”级别。 - jose
1个回答

4

使用模除运算对“新”值的累加和进行计算:

dat$cu5 <- with(dat, 1+ cumsum( c(0, varA[-length(varA)] != varA[-1])) %/% 5)

只有在需要从1开始编号时才需要添加一个。如果您对其进行了分解并添加了标签,则不需要。


  • 一个很棒的解决方案!这解决了我在另一篇帖子中提到的问题!
- jose
啊,是的,这是一个好问题。如果没有足够的唯一级别来进行分组,会发生什么?我期望它只有一个分组,但看起来它将重复项分组为5个。 - jose
我猜在那种情况下它不起作用。lselzers的也是如此,我认为@ttmaccer的在更长的情况下也不起作用,因为他第一个解决方案中的!duplicated(dat $ varA)表达式在第一系列之后永远返回FALSE,而这个测试实例会与他的第二个解决方案一起出现错误。 - IRTFM
我本来希望Jose能把勾选标记分配给更好的解决方案。我没有删除已接受答案的经验。 - IRTFM
@DWin 抱歉,直到现在才有机会查看该线程。尽管这是我在脚本中使用的代码,但我已经删除了“已接受的答案”。 - jose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接