【发布时间】:2020-06-11 21:53:47
【问题描述】:
更新为更真实的例子;这次在 interp_b 中添加了重复项。
我正在尝试使用来自第二个数据帧 (bait) 的值填充一个数据帧 (interp_b) 中的字段。我想查看interp_b 中每一行的obs_datetime,并确定在obs_datetime 之前最后一次引诱该情节站年份的时间。这稍后将用于计算每个obs_datetime 的自诱饵时间。诱饵时间位于bait_datetime 列中的bait 数据框中。结果应该放在interp_b 数据帧中名为latestbait_datetime 的字段中。
我正在可视化一个迭代过程,其中 interp_b "latestbait_datetime" 不断重新计算,直到到达诱饵数据框中的最后一行。我尝试的 for 循环显然是在行中运行并进行指定的计算,但我似乎无法以我想要的格式获得输出;它为每个循环生成输出,而不是重写和更新 interp_b 数据帧。
这是构建两个数据框的一些代码; interp_b 和 bait(请原谅我的粗鲁)
# interp_b dataframe----
structure(list(plot_station_year = c("Cow_C2_2019", "RidingStable_C3_2018",
"RidingStable_C3_2018", "Raf_C1_2018", "Metcalfe_C2_2019"), obs_datetime = structure(c(1559487600,
1544954400, 1541084400, 1515160800, 1567756800), class = c("POSIXct",
"POSIXt"), tzone = "UTC"), latestbait_datetime = structure(c(NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_), class = c("POSIXct",
"POSIXt"))), class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame"
), row.names = c(NA, -5L))
# bait dataframe----
structure(list(plot_station_year = c("Cow_C2_2019", "Cow_C2_2019",
"RidingStable_C3_2018", "Raf_C1_2018"), bait_datetime = structure(c(1557500400,
1559746800, 1543676400, 1491318000), class = c("POSIXct", "POSIXt"
), tzone = "UTC")), class = c("spec_tbl_df", "tbl_df", "tbl",
"data.frame"), row.names = c(NA, -4L), spec = structure(list(
cols = list(plot_station_year = structure(list(), class = c("collector_character",
"collector")), bait_datetime = structure(list(format = "%d-%m-%Y %H:%M"), class = c("collector_datetime",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), skip = 1), class = "col_spec"))
想要的结果应该是这样的
以下是我的两个尝试。第一次导致数据帧只包含循环的最终运行,第二次尝试导致数据帧包含所有运行结果(如绑定所期望的那样)。
library(tidyverse)
#attempt #1----
for (i in 1:nrow(bait)) {
print(paste("row =",i))
interpbait <- interp_b %>%
mutate(latestbait_datetime = if_else((plot_station_year == bait$plot_station_year[i] & (obs_datetime >= bait$bait_datetime[i] & (is.na(latestbait_datetime) | latestbait_datetime < bait$bait_datetime[i]))), bait$bait_datetime[i], latestbait_datetime))
}
#attempt #2----
resultb <- data.frame()
for (i in 1:nrow(bait)) {
print(paste("row =",i))
interpbait2 <- interp_b %>%
mutate(latestbait_datetime = if_else((plot_station_year == bait$plot_station_year[i] & (obs_datetime >= bait$bait_datetime[i] & (is.na(latestbait_datetime) | latestbait_datetime < bait$bait_datetime[i]))), bait$bait_datetime[i], latestbait_datetime))
resultb <- bind_rows(resultb, interpbait2)
print(resultb)
}
任何帮助将不胜感激。
【问题讨论】:
-
Akrun,我是 StackOverflow 的新手,我更新帖子时可能不小心删除了您的宝贵评论 - 对此感到抱歉。
标签: r loops dataframe for-loop iteration