【问题标题】:Filtering the first row in R过滤R中的第一行
【发布时间】:2020-11-23 16:28:44
【问题描述】:

我想使用dplyr 中的filter() 函数保留第一个观察结果。我的意思是,我会从过滤中获得许多满足相同标准的行,但我只想保留第一个,而不会进一步重复到group()distinct()。有可能吗?

我需要从数据框中提取第一个日期戳和第一个显示为“坏”的日期戳。

problem = data.frame(
  Status = c("Good",  "Good",  "Bad", "Bad", "Bad"),
  Date_entry = c(as.Date("2000-01-01"), as.Date("2000-01-02"), as.Date("2000-01-03"), as.Date("2000-01-04"),as.Date("2000-01-05")),
  Date_status = c(as.Date("1999-01-01"), as.Date("1999-01-01"), as.Date("1999-01-02"), as.Date("1999-01-02"), as.Date("1999-01-02")),
  Value = c(150,20,14,96,04))

我可以filter(Date == min(Date)) 但我不知道如何准确过滤掉第一个“坏”结果。 我试过filter(Date_entry== min(Date_entry) | (Date_status - Date_entry) == min(Date_status - Date_entry)) 但还是不行

solution = 
  data.frame(Status = c("Good", "Bad"),
             Date_entry = c(as.Date("2000-01-01"), as.Date("2000-01-02")),
             Date_status = c(as.Date("1999-01-01"), as.Date("1999-01-02")),
             Value = c(150,20))
             

【问题讨论】:

  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。也许你只需要slice(1)
  • 可以在filter()里面使用吗?
  • filter()之后使用。但是从你的描述中你的意思有点不清楚。同样,一个可重现的例子会让事情变得更加清晰。
  • 您可以使用filter(row_number() == 1),但如果您可以放宽“使用filter 函数”的要求,这就是slice 的用途。或者head(1) 也可以。
  • 哦,我明白了 - 再次阅读您的问题,您似乎有某些条件,而您只想要满足那个条件的第一行。一个可重现的例子会让这更清楚......

标签: r filter dplyr


【解决方案1】:

我认为您的要求可以解决

problem %>% 
  filter(Date_entry==min(Date_entry) | cumsum(Status=="Bad")==1)

在这里我们选择最小日期,或者我们使用cumsum(累积和)技巧选择 Bad 的第一个值。每次观察到“Bad”时,此数字都会增加 1,因此我们只需选择等于 1 的行(如果存在)。

【讨论】:

    【解决方案2】:

    这样的?

    library(dplyr)
    df <- data.frame(A=c(1,1,1,1,1,2,2,2,2,2),
                     B=c(1,2,3,4,5,1,2,3,4,5))
    head(df %>% filter(A==1),1)
    

    【讨论】:

      【解决方案3】:

      slice 的选项

      library(dplyr)
      problem %>%
         slice(union(which.min(Date_entry), match('Bad', Status)))
      

      -输出

      #  Status Date_entry Date_status Value
      #1   Good 2000-01-01  1999-01-01   150
      #2    Bad 2000-01-03  1999-01-02    14
      

      【讨论】:

        猜你喜欢
        • 2021-11-27
        • 1970-01-01
        • 2016-02-08
        • 2010-10-13
        • 2019-06-08
        • 2021-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多