如何在不使用循环的情况下将大型data.frame拆分为较小的?

时间:2016-11-17 15:14:43

标签: r dataframe

我有一个非常大的数据帧(20k行)数据帧基本上包含一些文本的日期/时间戳以及第一个时间戳和后续时间戳之间的增量。

@Override
public String getMessageInternal(String code, Object[] objects, final Locale locale) {
        String foo = super.getMessageInternal(code, objects, locale);

        return foo == null ? code : foo;
    }
}

我希望能够根据time.diff中包含的值将此数据帧拆分为更小的块(比如分成60秒的块)。因此,例如,使用子集分割成两个可以这样做,但如果我有一个更大的帧,我将最终编写1000行代码!

我还可以创建一个循环来迭代更大的数据帧并完成这个任务,但我知道在R中使用循环是相当慢的。

所以我想知道我可以采用什么方法将较大的帧拆分成许多较小的帧,其方式不使用循环,并且还可以增加较小的数据帧名称,例如df.sub.1,df.sub.2 ... df.sub.3

                date   text time.diff
1 2016-03-09 15:50:07 Text 1     0.000
2 2016-03-09 15:50:10 Text 2     2.808
3 2016-03-09 15:50:17 Text 3    10.128
4 2016-03-09 15:50:53 Text 4    45.952
5 2016-03-09 21:26:15 Text 5    65.053

我已经包含了一些示例代码来创建前六行,希望这些代码足以让人们在这里提出建议。

# Split into two frames based on matched criteria
df.split1 <- subset(df.tosplit, time.diff <= 60)
df.split2 <- subset(df.tosplit, time.diff > 60)

> df.split1
                 date   text time.diff
1 2016-03-09 15:50:07 Text 1     0.000
2 2016-03-09 15:50:10 Text 2     2.808
3 2016-03-09 15:50:17 Text 3    10.128
4 2016-03-09 15:50:53 Text 4    45.952
> df.split2
                 date   text time.diff
5 2016-03-09 21:26:15 Text 5    65.053
6 2016-03-09 21:26:20 Text 6    85.110

2 个答案:

答案 0 :(得分:3)

使用split()

split(df, paste0("df.split", df$time.diff %/% 60))

$df.split0
                  dat   text time.diff
1 2016-03-09 15:50:07 Text 1     0.000
2 2016-03-09 15:50:10 Text 2     2.808
3 2016-03-09 15:50:17 Text 3    10.128
4 2016-03-09 15:50:53 Text 4    45.952

$df.split1
                  dat   text time.diff
5 2016-03-09 21:26:15 Text 5    65.053
6 2016-03-09 21:26:20 Text 6    85.110

异国情调的方式(见解释here):

list2env(split(df, paste0("df.split", df$time.diff %/% 60)), .GlobalEnv)

答案 1 :(得分:1)

不是为每种情况创建一个循环,而是创建一个60秒条件作为索引的序列将启用分割点。

indx <- cut(df.tosplit$time.diff, 
            c(seq(0, max(df.tosplit$time.diff), by=60),Inf), 
            right=FALSE)
split(df.tosplit, indx)
# $`[0,60)`
#                  date   text time.diff
# 1 2016-03-09 15:50:07 Text 1     0.000
# 2 2016-03-09 15:50:10 Text 2     2.808
# 3 2016-03-09 15:50:17 Text 3    10.128
# 4 2016-03-09 15:50:53 Text 4    45.952
# 
# $`[60,Inf)`
#                  date   text time.diff
# 5 2016-03-09 21:26:15 Text 5    65.053
# 6 2016-03-09 21:26:20 Text 6    85.110