【问题标题】:filter based on condition met in another column根据在另一列中满足的条件进行过滤
【发布时间】:2021-07-04 03:25:05
【问题描述】:

我想根据特定“名称”的最后日期过滤数据框的行。

name  date
a     2021-06-30
a     2021-07-01
a     2021-07-02
b     2021-06-29
b     2021-06-30
c     2021-07-02
c     2021-07-03
name date
a    2021-07-02
b    2021-06-30
c    2021-07-03

但是最后一个日期显示为日期列的绝对最大值,我相信代码,而不是基于名称列的最后一个日期

    df <- as.data.frame(tbl(con,"SQL Table"))
    last <- df %>%
      group_by(name) %>%
      summarize(date = max(date))
    name <- last$name
    end <- last$date

df <- filter(df, name == name & date == end)

以上结果

name date
a    2021-07-03
b    2021-07-03
c    2021-07-03

【问题讨论】:

  • last 不是已经有你预期的输出了吗?

标签: r filter


【解决方案1】:

我们可以使用last

library(dplyr)
df %>% 
  group_by(name) %>% 
  summarize(date = last(date))

输出:

  name  date      
* <chr> <chr>     
1 a     2021-07-02
2 b     2021-06-30
3 c     2021-07-03

【讨论】:

    【解决方案2】:

    我们可以使用slice_tail

    library(dplyr)
    df %>%
        group_by(name) %>% 
        slice_tail(n = 1) %>%
        ungroup
    

    -输出

    # A tibble: 3 x 2
      name  date      
      <chr> <date>    
    1 a     2021-07-02
    2 b     2021-06-30
    3 c     2021-07-03
    

    或者slice_max

    df %>%
         group_by(name) %>%
         slice_max(n = 1, order_by = 'date') %>%
         ungroup
    

    数据

    df <- structure(list(name = c("a", "a", "a", "b", "b", "c", "c"),
     date = structure(c(18808, 
    18809, 18810, 18807, 18808, 18810, 18811), class = "Date")), 
    row.names = c(NA, 
    -7L), class = "data.frame")
    

    【讨论】:

      猜你喜欢
      • 2020-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-21
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 2018-05-09
      相关资源
      最近更新 更多