【问题标题】:Group variable by "n" consecutive integers in data.table通过 data.table 中的“n”个连续整数对变量进行分组
【发布时间】:2021-12-01 07:37:04
【问题描述】:
library(data.table)

DT <- data.table(var = 1:100)

我想创建第二个变量group,它将var 中的值按n 连续整数分组。因此,如果 n 等于 1,它将返回与 var 相同的列。如果n=2,它会返回我:

  var   group
1:   1   1
2:   2   1
3:   3   2
4:   4   2
5:   5   3
6:   6   3

如果n=3,它会返回我:

  var   group
1:   1   1
2:   2   1
3:   3   1
4:   4   2
5:   5   2
6:   6   2

等等。我想尽可能灵活地做到这一点。

注意可能有重复的值:

  var   group
1:   1   1
2:   1   1
3:   2   1
4:   3   2
5:   3   2
6:   4   2

这里group对应n=2.谢谢!

【问题讨论】:

  • DT[, group := ((.I - 1) %/% n) + 1] 将根据您对大于 0 的任何 n 显示的内容起作用,但如果需要根据 var 是否连续而改变行为,您需要提供一个示例并解释当var连续时会发生什么。
  • @GregorThomas 感谢您的评论。我应该更具体地道歉。 var 变量将始终为严格正数。但是,我应该注意到var 的值可能重复。但是您的解决方案仍然很有效。非常感谢。
  • 我的意思是,var 的值似乎根本不重要。而且我的解决方案根本不使用它们。
  • 抱歉我的评论,@akrun,我不希望恶意和误解了一些代码。在我们讨论它时,我发现了突出我们方法差异的极端案例。

标签: r data.table


【解决方案1】:

我认为我们可以为此使用findInterval

DT <- data.table(var = c(1L, 1:10))

n <- 2
DT[, group := findInterval(var, seq(min(var), max(var) + n, by = n))]
#       var group
#     <int> <int>
#  1:     1     1
#  2:     1     1
#  3:     2     1
#  4:     3     2
#  5:     4     2
#  6:     5     3
#  7:     6     3
#  8:     7     4
#  9:     8     4
# 10:     9     5
# 11:    10     5

n <- 3
DT[, group := findInterval(var, seq(min(var), max(var) + n, by = n))]
#       var group
#     <int> <int>
#  1:     1     1
#  2:     1     1
#  3:     2     1
#  4:     3     1
#  5:     4     2
#  6:     5     2
#  7:     6     2
#  8:     7     3
#  9:     8     3
# 10:     9     3
# 11:    10     4

(在对seq 的调用中的+n 是为了让我们总是比我们需要的多一点;如果我们只做seq(min(.),max(.),by=n),那么var 的最高值可能会在外面顺序。也可以使用c(seq(min(.), max(.), by=n), Inf) 来达到相同的效果。)

【讨论】:

    猜你喜欢
    • 2019-12-28
    • 1970-01-01
    • 2021-09-26
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多