通过在R中对变量进行分组来避免循环

时间:2015-08-21 15:39:22

标签: r loops

我是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的新手,我自己找不到。

任何帮助都会非常感激。提前谢谢!

2 个答案:

答案 0 :(得分:3)

您可以使用简单的公式从ID中获取组:

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

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

有很多方法可以做到这一点(比如将1:1029600重新整形为具有4320列的矩阵并采用6 * N:6 *(N + 1)列并进行匹配等)但这就是为什么你应该总是停下来想想你真正想要做什么。并意识到它归结为一个小算术:)

答案 1 :(得分:0)

创建样本数据

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]