【问题标题】:Avoiding loop by grouping variable in R通过在 R 中对变量进行分组来避免循环
【发布时间】:2015-08-21 15:39:21
【问题描述】:

我是 R 的新手,并且已经被一个问题困扰了很长一段时间...... 我有一个包含超过 1,000,000 个观察值的大数据集(最初是网格数据),并且必须为我的元素创建一个组变量。 我的数据集如下所示:

ID        Var1
1         0,5 
2         0,6 
3         0,2 
4         0,15
...       ... 
1029600   0,43

我现在想要的是按照以下方案进行分组:

1       2       3       4       5       6      ...   4320
4321    4322    4322    4322    4322    4322   ...   8640
8641    8642    8643    8644    8645    8646   ...   12960
12961    12962  12963   12964   12965   12966  ...   17280
17281   17282   17283   17284   17285   17286  ...   21600
21601   21602   21603   21604   21605   21606  ...   25920
...      ...     ...    ...     ...     ...    ...    ...
1025281 1025282 1025283 1025284 1025285 1025286...   1029600

其中 36 个数字 {1,2,3,4,5,6,4321,4322,4323,4324,4325,4326,8641,8642,...,21060} 是第一组。 第二组是 {7,8,9,10,11,12,4327,4328,...,21612}。第三组将从 {13,14,15...} 开始。等等所有的观察。我希望我能明确我的目标是什么。我想用图片来形象化,但作为新成员,这是不可能的。

到目前为止,我设法用一个非常丑陋的循环函数来做到这一点,如下所示:

for(k in 0:40) { 
    nk <- 25920 * k
    mk <- 720 * k
    for (j in 0:719) {
        cj <- j * 6
        for (i in 0:5) { 
            ai <- i * 4320 + 1 + cj + nk
            bi <- i * 4320 + 6 + cj + nk
            group[ai:bi] <- 1 + j + mk
        }
    }
} 

我知道这是非常低效的,并且使用循环计算它需要很长时间。我很确定有一种更简单的方法可以解决我的问题,但是由于我是 R 新手,所以我自己找不到。

任何帮助将不胜感激。提前谢谢!

【问题讨论】:

  • 我很困惑。为了澄清我正确理解了这个问题:您是否想根据矩阵中子矩阵中的 ID 位置为具有连续 ID 的数据帧添加分组因子?
  • 你的问题不是很清楚,但听起来你想要的东西类似于here所要求的东西

标签: r loops


【解决方案1】:

您可以通过一个简单的公式从 ID 中获取组:

group &lt;- (((ID-1) %% 4320) %/% 6) +1

请注意,%% 是模运算,%/% 是整数除法。该公式应为您提供从 1 开始编号的组。无需将其包含在循环中,它是矢量化操作。

有很多方法可以做到这一点(例如将 1:1029600 重塑为具有 4320 列的矩阵并取 6*N:6*(N+1) 列并进行匹配或其他操作),但这就是为什么您应该总是停下来想想你真正想做什么。并意识到它归结为一点算术:)

【讨论】:

    【解决方案2】:

    创建样本数据

    dtf <- data.frame(ID = 1:1e4, Var1 = rnorm(1:1e4))
    

    @antine-sac 解释的分组:

    group <- (((dtf$ID-1) %% 4320) %/% 6) +1
    

    拆分数据

    dtfsplit <- split(dtf, group)
    

    第一组

    > dtfsplit[1]
    $`1`
           ID     Var1
    1       1  0.56655
    2       2  0.87645
    3       3 -1.41986
    4       4 -1.84881
    5       5  0.03233
    6       6  3.06512
    4321 4321 -1.57179
    4322 4322 -1.09958
    4323 4323  0.55980
    4324 4324  0.32390
    4325 4325  0.85438
    4326 4326 -0.10311
    8641 8641  2.08886
    8642 8642  1.19836
    8643 8643  0.52592
    8644 8644  0.20571
    8645 8645  1.08429
    8646 8646  0.69648
    

    第二组

    dtfsplit[2]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 2021-08-21
      • 1970-01-01
      • 2011-03-20
      相关资源
      最近更新 更多