【问题标题】:Consecutively filter rows satisfyingly if condition in R dataframe如果 R 数据框中的条件满足条件,则连续过滤行
【发布时间】:2021-10-20 17:25:54
【问题描述】:

在 R 数据框dt_df 中,我想将具有以下序列中的值的所有行保留为新数据框。 我可以拥有dt_diff -1 到 20 之间的任何数字。 现在,我想从1(前一天)开始检查dt_diff 是否有1。如果有1,过滤dt_diff中所有带有1的行,将其保留为新的数据框并停止处理,如果没有1,检查是否有2,如果有@987654331 @ 保留所有带有2 的行作为新数据框并停止处理,依此类推,直到20。如果1到20之间没有任何值,则检查是否有0,如果有0,则保留0的行作为新的数据框,并停止处理。如果没有 0 或 1 到 20 之间的任何值,则检查是否存在 -1 并将所有带有 -1 的行保留为新数据框。我怎样才能做到这一点?这是示例数据和不成功的 for 循环,if 条件。

dt_df <- structure(list(date = structure(c(12241, 12241, 12257, 12257,
  12257, 12257, 12257, 12257, 12257, 12257, 12259), class = "Date"),
  ref_date = structure(c(12259, 12259, 12259, 12259, 12259,
    12259, 12259, 12259, 12259, 12259, 12259), class = "Date")), row.names = c(NA,
      -11L), class = c("tbl_df", "tbl", "data.frame"))
dt_df
dt_df$dt_diff <- as.numeric(dt_df$ref_date -dt_df$date)
pbl_dt_seq <- seq(-1, 20, 1)
pbl_dt_seq

for (i in 1:length(pbl_dt_seq)) {
    i <- 2 # start with number 1
     if(any(dt_df$dt_diff) == i ){
      retain_dt <- dt_df %>%
           filter(dt_diff == i)
      retain_dt
      break
    }
  if(any(dt_df$dt_diff) ==i+1 ){
      retain_dt <-dt_df%>%
        filter(dt_diff == i+1)
      retain_dt
      break
    }
  }

【问题讨论】:

  • split(dt_df, dt_df$dt_diff) 做你想做的事吗?
  • 不,因为在这个例子中我只想保留 dt_df$dt_diff =2' as a new data frame and ignore others. But this 2` 可以改变并且不确定如何按照问题中提到的顺序保留。

标签: r dataframe for-loop if-statement tidyverse


【解决方案1】:

按照您要检查值的顺序创建序列,首先是 1 到 20,然后是 0 和 -1。 arrange 数据,以便数据按正确的顺序排序,并选择与数据框中的第一个 dt_diff 相似的行。

librayr(dplyr)
pbl_dt_seq <- c(1:20, 0, -1)

dt_df %>%
  arrange(match(dt_diff, pbl_dt_seq)) %>%
  filter(dt_diff == first(dt_diff))

#   date       ref_date   dt_diff
#  <date>     <date>       <dbl>
#1 2003-07-24 2003-07-26       2
#2 2003-07-24 2003-07-26       2
#3 2003-07-24 2003-07-26       2
#4 2003-07-24 2003-07-26       2
#5 2003-07-24 2003-07-26       2
#6 2003-07-24 2003-07-26       2
#7 2003-07-24 2003-07-26       2
#8 2003-07-24 2003-07-26       2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 2021-10-15
    • 1970-01-01
    相关资源
    最近更新 更多