【问题标题】:Ranking Values of data frame excluding same dates不包括相同日期的数据框的排名值
【发布时间】:2018-12-26 22:52:07
【问题描述】:

我有一个包含日期和值的数据框:

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

但我正在寻找一种更微妙的方式。

谢谢

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这与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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      相关资源
      最近更新 更多