r - 如何在事件发生后快速更新变量值?
问题描述
我想在 year 发生o
事件后更新变量的值。> 500k 行的解决方案似乎很慢。因此,寻找一个更快的解决方案,我试图通过使用来避免子集,它有点快,但没有预期的那么多。有没有更快的方法在(或者可能在)中做这些事情?r
y
lapply()
aggregate()
base R
data.table
例子
# lapply
lapply(split(df2, df2$id), function(x) {
ry <- x$y[which(x[, "r"] == 1)]
x[x$y >= ry, "o"] <- 1
x
})
# aggregate
df2 <- merge(df1, with(df1, aggregate(list(ry=r), by=list(id=id),
function(x) y[which(x == 1)])))
lapply(split(df2, df2$id), function(x) {
x$o[x$y >= unique(x$ry)] <- 1
x
})
# Output for id `11`
id ry y o r
1 11 2003 2005 1 0
2 11 2003 2004 1 0
3 11 2003 2003 1 1
4 11 2003 2002 0 0
5 11 2003 2001 0 0
基准
Unit: microseconds
expr min lq mean median uq max neval cld
lapply 915.181 929.724 988.2273 934.699 943.2465 5150.221 100 b
aggregate 790.418 803.175 844.8039 810.192 817.4635 3474.984 100 a
数据
df1 <- structure(list(id = c(11, 11, 11, 11, 11, 22, 22, 22, 22, 22,
33, 33, 33, 33, 33, 44, 44, 44, 44, 44, 55, 55, 55, 55, 55),
y = c(2005L, 2004L, 2003L, 2002L, 2001L, 2005L, 2004L, 2003L,
2002L, 2001L, 2005L, 2004L, 2003L, 2002L, 2001L, 2005L, 2004L,
2003L, 2002L, 2001L, 2005L, 2004L, 2003L, 2002L, 2001L),
o = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0), r = c(0, 0, 1, 0, 0, 0, 1, 0, 0,
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1)), out.attrs = list(
dim = c(id = 5L, y = 5L, o = 1L, r = 1L), dimnames = list(
id = c("id=11", "id=22", "id=33", "id=44", "id=55"),
y = c("y=2001", "y=2002", "y=2003", "y=2004", "y=2005"
), o = "o=0", r = "r=0")), row.names = c(NA, -25L), class = "data.frame")
解决方案
推荐阅读
- python - 从图像文件中查找 numpy 数组中最近的颜色簇
- python - Python Beautifulsoup 获取超链接
- r - 是否存在检查数据框是否属于嵌套列表列表的逻辑条件?
- visual-c++ - 使用 CSettingsStore 枚举子键
- python - 在python中过滤嵌套列表
- android - Android 从 GeoJson 获取多边形的属性
- excel - 如何为直到最后一行数据集编写 VBA
- angular - 是否可以切换 Angular HTML 模板?
- laravel - Laravel 中 JOIN 后的 2 id 列。如何访问 Controller 和 Blade 中的两个 ID?
- json - 不要在列中显示 JSON 数据