【发布时间】:2015-06-12 06:56:42
【问题描述】:
我有一个包含年份、日期和温度测量值 (TMEAN) 的数据表 (DT):
YEAR DATE TMEAN
2010 2010-01-01 -5
2010 2010-01-02 -9
2010 2010-01-03 -6
2010 2010-01-04 0.1
2010 2010-01-05 -0.5
2010 2010-01-06 1
2010 2010-01-07 1.6
2010 2010-01-08 8
2010 2010-01-09 6
2010 2010-01-10 3
2010 2010-01-11 5
2010 2010-01-12 3
2011 2011-01-01 -3
2011 2011-01-02 -5.4
2011 2011-01-03 -3.6
2011 2011-01-04 0.06
2011 2011-01-05 -0.3
2011 2011-01-06 0.6
2011 2011-01-07 0.96
2011 2011-01-08 4.8
2011 2011-01-09 3.6
2011 2011-01-10 1.8
2011 2011-01-11 3
2011 2011-01-12 1.8
对于每一年,我需要获得至少连续 5 天测量结果为阳性的第一天...
一个想法是:
for (y in min(DT$YEAR):max(DT$YEAR)) {
for (i in 1:nrow(DT)) {
DT$test <- ifelse(DT[i, TMEAN] > 0 & DT[i+1, TMEAN] > 0 & DT[i+2, TMEAN] > 0 & DT[i+3, TMEAN] > 0 & DT[i+4, TMEAN] > 0, 1, 0)
}
}
DT2 <- DT[test == 1, ][, list(START = min(DATE)), by = .(YEAR)]
但它超级慢(而且不那么优雅!)。
如何替换 for 和 ifelse 的多次使用?
【问题讨论】:
-
请提供
DT的可重现示例。 -
简单地说,你应该真正开始写
DT$test <- ifelse(DT[i, TMEAN] > 0 & DT[i+1, TMEAN] > 0 & DT[i+2, TMEAN] > 0 & DT[i+3, TMEAN] > 0 & DT[i+4, TMEAN] > 0, 1, 0)作为一个函数,然后使用lapply。然后不要使用外部for,而是尝试为条件创建一个真/假值,然后将其合并到您的函数中。一般来说,尽可能在 r 中摆脱 for 循环并利用矢量化。 -
感谢您的提示...我正试图朝着这些方向前进以提高我的 R 计算效率(以及使用 data.table 进行二进制搜索)
-
@user2165907 在示例中,数据是有序的。您的原始数据集中是这种情况吗?
-
是的,我还处理更多因素(例如车站)...我为每个因素组合进行操作
标签: r data.table