Ранжирование значений фрейма данных, исключая те же даты - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть фрейм данных с датами и значениями:

library(dplyr)
library(lubridate) 

df<-tibble(DateTime=ymd(c("2018-01-01","2018-01-01","2018-01-02","2018-01-02","2018-01-03","2018-01-03")),
              Value=c(5,10,12,3,9,11),Rank=rep(0,6))

Я хотел бы ранжировать значения двух последних строк, каждая из которых сравнивается с остальными четырьмя строками значений (значениями предыдущих дат).

Мне удалось сделать это:

dfReference<-df%>%filter(DateTime!=max(DateTime))

dfTarget<-df%>%filter(DateTime==max(DateTime))

for (i in 1:nrow(dfTarget)){
  tempDf<-rbind(dfReference,dfTarget[i,])%>%
    mutate(Rank=rank(Value,ties.method = "first"))
  dfTarget$Rank[i]=filter(tempDf,DateTime==max(df$DateTime))$Rank
}

Желаемый результат:

> dfTarget
# A tibble: 2 x 3
  DateTime   Value  Rank
  <date>     <dbl> <dbl>
1 2018-01-03     9     3
2 2018-01-03    11     4

Но я ищу более деликатный способ.

Спасибо

1 Ответ

0 голосов
/ 26 декабря 2018

По сути, это та же идея, что и цикл for, но вместо цикла он использует map_int, и вместо создания нового фрейма данных с использованием rbind создается новый вектор с c().

library(tidyverse)

is.max <- with(df,  DateTime == max(DateTime))

df[is.max,] %>% 
  mutate(Rank = map_int(Value, ~
    c(df$Value[!is.max], .x) %>% 
      rank(ties.method = 'first') %>% 
      tail(1)))



# # A tibble: 2 x 3
#   DateTime   Value  Rank
#   <date>     <dbl> <int>
# 1 2018-01-03     9     3
# 2 2018-01-03    11     4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...