R语言 根据列的最大值过滤数据框

uurity8g  于 2022-12-25  发布在  其他
关注(0)|答案(1)|浏览(146)

我有一个数据框,它有10列和"n"行(很多行)。
Dataframe 的概念很简单:它获取在时间"d"对日期"t"的汇率的市场预期。例如:今天,我们有1月23日、2月23日等汇率的市场预期......(此数据框架按月提供预期,每日更新)
该数据框架包含自2019年1月至2023年12月的历史估计值。
总之,我们有一个"date_of_estimate"列和一个"estimation_reference"列。
问题是,我想过滤这个庞大的数据框架,以获得自2019年1月1日以来所有月度估计的最新值。
因此,代码应该像一个maxif函数一样工作,它根据"estimation_reference"值获取"date_of_estimate"列的最大值。"estimation_reference"也可以解释为字符串,如"Group_A"、"Group_B"等。
我怎样才能得到我想要的结构呢?我对R不是很熟悉,这是一个重要的工作程序,刚刚落在我的腿上...
先谢了
我的第一个猜测是使用聚合函数,我使用的代码是这样的:

`Cambio_PorDataRef = aggregate(base_cambio, by = list(base_cambio$Data), max)`

其中base_cambio是包含所有日期和估计值的原始 Dataframe ,base_cambio $data是我上面提到的"date_of_estimate"列。
结果是:enter image description here
"data_referencia"列应该由唯一值组成,其中"date_of_estimate"(图像中的第1组列)应该是最新更新的(此估计值可用的最新日期),但它带来了重复的值,这些值似乎没有意义,因为它应该从2021年1月开始,并逐月进行,直到2023年12月(即12月23日)。
通过运行dput(head(base_cambio,20)),我得到了:

structure(list(Indicador = c("Câmbio", "Câmbio", "Câmbio", "Câmbio", 
"Câmbio", "Câmbio", "Câmbio", "Câmbio", "Câmbio", "Câmbio", "Câmbio", 
"Câmbio", "Câmbio", "Câmbio", "Câmbio", "Câmbio", "Câmbio", "Câmbio", 
"Câmbio", "Câmbio"), Data = structure(c(18655, 18654, 18653, 
18652, 18649, 18648, 18647, 18646, 18645, 18642, 18641, 18640, 
18639, 18638, 18635, 18634, 18633, 18632, 18631, 18683), class = "Date"), 
    DataReferencia = c("01/2021", "01/2021", "01/2021", "01/2021", 
    "01/2021", "01/2021", "01/2021", "01/2021", "01/2021", "01/2021", 
    "01/2021", "01/2021", "01/2021", "01/2021", "01/2021", "01/2021", 
    "01/2021", "01/2021", "01/2021", "02/2021"), Media = c(5.3, 
    5.29, 5.29, 5.29, 5.28, 5.25, 5.25, 5.25, 5.24, 5.24, 5.22, 
    5.21, 5.21, 5.19, 5.17, 5.14, 5.14, 5.13, 5.13, 5.38), Mediana = c(5.3, 
    5.3, 5.3, 5.3, 5.3, 5.25, 5.25, 5.25, 5.25, 5.25, 5.21, 5.2, 
    5.2, 5.16, 5.15, 5.15, 5.15, 5.14, 5.13, 5.4), DesvioPadrao = c(0.11, 
    0.11, 0.11, 0.11, 0.11, 0.1, 0.1, 0.1, 0.1, 0.11, 0.14, 0.14, 
    0.15, 0.15, 0.15, 0.14, 0.13, 0.13, 0.13, 0.07), Minimo = c(4.85, 
    4.85, 4.85, 4.85, 4.85, 4.85, 4.85, 4.85, 4.85, 4.85, 4.85, 
    4.85, 4.85, 4.85, 4.85, 4.85, 4.85, 4.85, 4.85, 5), Maximo = c(5.62, 
    5.62, 5.5, 5.5, 5.5, 5.5, 5.5, 5.5, 5.5, 5.5, 5.49, 5.49, 
    5.6, 5.6, 5.6, 5.6, 5.6, 5.6, 5.6, 5.52), numeroRespondentes = c(102L, 
    102L, 100L, 99L, 99L, 95L, 97L, 97L, 97L, 98L, 92L, 92L, 
    90L, 89L, 90L, 91L, 90L, 90L, 89L, 107L), baseCalculo = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L)), row.names = c(NA, -20L), class = c("tbl_df", 
"tbl", "data.frame"))

数据框如下所示:

该函数应查找最高第二列的(最新)值(Data)表示第三列中的每个唯一匹配项由于该 Dataframe 仅具有一个唯一值,因此整个第一行应当是im寻找的码的输出,因为它在第二列上具有最高值。代码应该能够对第三列上的每个唯一值做同样的事情,并将其全部收集到一个新的 Dataframe 中,过滤,原始 Dataframe 的所有列。
输出应为:

9gm1akwq

9gm1akwq1#

您需要dplyr::slice_max()

library(dplyr)

base_cambio_recent <- base_cambio %>% 
  group_by(DataReferencia) %>% 
  slice_max(Data) %>% 
  ungroup()

或者一个基本R方法:

base_cambio_recent <- base_cambio[rev(order(base_cambio$Data)), ] 
base_cambio_recent <- lapply(
  split(base_cambio_recent, base_cambio_recent$DataReferencia),
  \(x) head(x, 1)
)
base_cambio_recent <- do.call(rbind, base_cambio_recent)

任一方法的结果:

# A tibble: 2 × 10
  Indicador Data       DataReferencia Media Mediana DesvioPadrao Minimo Maximo numeroRespondentes baseCalculo
  <chr>     <date>     <chr>          <dbl>   <dbl>        <dbl>  <dbl>  <dbl>              <int>       <int>
1 Câmbio    2021-01-28 01/2021         5.3      5.3         0.11   4.85   5.62                102           0
2 Câmbio    2021-02-25 02/2021         5.38     5.4         0.07   5      5.52                107           0

相关问题