我有一个非常大的数据帧(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
答案 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