r - 使用来自另一个 DF 的中断对组内的数据进行分箱
问题描述
下面代码中如何避免使用for循环来加快计算速度(实际数据大约大1e6倍)
id = rep(1:5, 20)
v = 1:100
df = data.frame(groupid = id, value = v)
df = dplyr::arrange(df, groupid)
bkt = rep(seq(0, 100, length.out = 4), 5)
id = rep(1:5, each = 4)
bktpts = data.frame(groupid = id, value = bkt)
for (i in 1:5) {
df[df$groupid == i, "bin"] = cut(df[df$groupid == i, "value"],
bktpts[bktpts$groupid == i, "value"],
include.lowest = TRUE, labels = F)
}
解决方案
我不确定为什么你bktpts
的格式是这样的?
但这里有一个 data.table 解决方案,它应该(至少有点)比你的 for 循环快。
library( data.table )
setDT(df)[ setDT(bktpts)[, `:=`( id = seq_len(.N),
value_next = shift( value, type = "lead", fill = 99999999 ) ),
by = .(groupid) ],
bin := i.id,
on = .( groupid, value >= value, value < value_next ) ][]
推荐阅读
- core-data - 修改 CoreData 时如何在 SwiftUI 中更新 TabView?
- django - 没有名为“mysite.settings”的模块
- flutter - 图片未上传 Flutter
- mysql - 将多列合并为一个新列,同时保留原始列
- arrays - 检查数组是否下降到局部最小值,然后在 C 中上升
- r - 我可以省略 r 中数据集的搜索结果吗?
- python - 如何使用python将实际的二进制数保存到文件中
- android - 在 Flutter 中无法接受 android SDK 的 SDK 许可证
- c# - Read delimited record containing delimited field with varying length with FileHelpers in C#?
- c# - C# WPF Select in DataGrid the first row with pressing Enter from a Textbox