【发布时间】:2021-01-13 05:03:10
【问题描述】:
所以我认为我在这个问题上想多了,我已经设法创建了一个功能代码,但是它非常慢,我认为如果我正确使用 Purrr,我会看到这个功能的巨大改进。
我有如下数据集
library(tidyverse)
library(purrr)
library(lubridate)
Row_ID <- c(1,2,3,4,5,6,7)
Tag <- c("A","A","A","A","A","B","B")
From_Location <-c("Farm1",
"Farm2",
"Farm3",
"Farm4",
"Farm3",
"Farm2",
"Farm3")
Date <- c("2020-01-06", "2019-08-17", "2019-02-05", "2019-01-01", "2018-04-02", "2020-09-01", "2019-12-23")
Foo <- tibble(Row_ID, Tag, From_Location, Date) %>%
mutate(Date = anydate(Date))
# A tibble: 8 x 4
Row_ID Tag From_Location Date
<dbl> <chr> <chr> <chr>
1 1 A Farm1 2020-01-06
2 2 A Farm2 2019-08-17
3 3 A Farm3 2019-02-05
4 4 A Farm4 2019-01-01
5 5 A Farm3 2018-04-02
6 6 B Farm2 2020-09-01
7 7 B Farm3 2019-12-23
我想为每一行确定标签在特定农场上的最后日期。 IE。该组中的最后一次 From_Location == "Farm3" 然后返回该列的“日期”。在我的特定用例中,下面一行中总会有一个“Farm3”,因为我意识到我的方法由于 max() 在下面没有行时没有输入而中断。
我想出的方法是创建一个我可以映射的函数,它给了我最大的日期。它有效,但我认为有一种更好的方法可以正确使用 Purrr
FoI = "Farm3"
Last_Date <- function(ID, Row){
dat <- Foo %>%
filter(Row_ID >= Row & Tag == ID & From_Location == FoI) %>%
.$Date %>%
max () %>%
as.character()
return(dat)
}
Last_Date("A", "4")
Foo_CP <- Foo %>%
mutate(Movement_Off_IP = purrr::pmap(list(Tag, Row_ID), .f =Last_Date),
Movement_Off_IP = ymd(Movement_Off_IP))
# A tibble: 7 x 5
Row_ID Tag From_Location Date Movement_Off_IP
<dbl> <chr> <chr> <date> <date>
1 1 A Farm1 2020-01-06 2019-02-05
2 2 A Farm2 2019-08-17 2019-02-05
3 3 A Farm3 2019-02-05 2019-02-05
4 4 A Farm4 2019-01-01 2018-04-02
5 5 A Farm3 2018-04-02 2018-04-02
6 6 B Farm2 2020-09-01 2019-12-23
7 7 B Farm3 2019-12-23 2019-12-23
【问题讨论】: