[R] sort
Rui Barradas
ru|pb@rr@d@@ @end|ng |rom @@po@pt
Fri May 15 14:29:18 CEST 2020
Hello,
Here is a dplyr solution. arrange() sorts by name and desc(ddate) and
top_n keeps the first 2 after grouping by ddate. Then it's a matter of
being careful with diff() in the summarise instruction.
library(dplyr)
DF1 %>%
mutate(ddate = as.Date(ddate)) %>%
arrange(name, desc(ddate)) %>%
group_by(name) %>%
top_n(2) %>%
summarise(diff = ifelse(n() > 1, diff(rev(ddate)), 0))
#Selecting by ddate
## A tibble: 3 x 2
# name diff
# <chr> <dbl>
#1 A 76
#2 B 305
#3 c 0
Hope this helps,
Rui Barradas
Às 03:58 de 15/05/20, Val escreveu:
> HI All,
> I have a sample of data frame
> DF1<-read.table(text="name ddate
> A 2019-10-28
> A 2018-01-25
> A 2020-01-12
> A 2017-10-20
> B 2020-11-20
> B 2019-10-20
> B 2017-05-20
> B 2020-01-20
> c 2009-10-01 ",header=TRUE)
>
> 1. I want sort by name and ddate on decreasing order and the output
> should like as follow
> A 2020-01-12
> A 2019-01-12
> A 2018-01-25
> A 2017-10-20
> B 2020-11-21
> B 2020-11-01
> B 2019-10-20
> B 2017-05-20
> c 2009-10-01
>
> 2. Take the top two rows by group( names) and the out put should like
> A 2020-01-12
> A 2019-01-12
> B 2020-11-21
> B 2020-11-01
> c 2009-10-01
>
> 3. Within each group (name) get the date difference between the
> first and second rows dates. If a group has only one row then the
> difference should be 0
>
> The final out put is
> Name diff
> A 365
> B 20
> C 0
>
> Here is my attempt and have an issue at the sorting
> DF1$DTime <- as.POSIXct(DF1$ddate , format = "%Y-%m-%d")
> DF2 <- DF1[order(DF1$name, ((as.Date(DF1$DTime, decreasing = TRUE)))), ]
>
> not working
> Any help?
>
> Thank you
>
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>
More information about the R-help
mailing list