【发布时间】:2019-12-16 15:35:36
【问题描述】:
我有一段代码遇到了问题。此处稍作修改,作为一个简单的可重现示例:
df <- data.frame(
"ID" = c(1, 2, 3, 4, 5, 6),
"max_ID" = c(6, 6, 6, 6, 6, 6),
"start_date" = as.Date(c("2015-01-01", "2016-01-01", "2017-01-01", "2018-01-01", "2019-01-01", "2020-01-01")),
"end_date_1" = as.Date(c("2015-12-31", "2016-12-31", "2019-12-31", "2019-12-31", "2019-12-31", "2019-12-31")),
"end_date_2" = as.Date(c(NA, NA, NA, NA, NA, NA))
)
num_rows <- nrow(df) #6
for(row_idx in 1:num_rows)
{
if(df$ID[row_idx] == df$max_ID[row_idx])
{
df$end_date_2[row_idx] <- df$end_date_1[row_idx]
}
else
{
df$end_date_2[row_idx] <- df$start_date[row_idx + 1] %m-% days(1)
}
}
在这个简单的示例中,它运行得非常快,但在实际应用中却非常慢。它在一个很长的表中运行(但即便如此,它也比在同一个表中运行的其他一些循环慢得多)。
导致问题的代码有什么特别的地方吗(例如 lubridate "%m-%" 位)?
当然更好的是“矢量化”它,因为我确信它会运行得更快。使它变得困难的是对下一行的引用([row_idx + 1] 位)。有没有办法在不使用(慢)循环的情况下做到这一点?
谢谢。
【问题讨论】:
-
这将引用以下行
c(tail(df$start_date, -1), NA)。有一些包将其作为函数提供(例如,data.table::shift和 afaik,dplyr 中也有一些东西)。 -
谢谢。我经常使用 dplyr,所以也许我应该查看该软件包的文档并看看我能找到什么......