【问题标题】:Conditional filter of rows based on the values of multiple variables in previous row根据前一行中多个变量的值对行进行条件过滤
【发布时间】:2019-09-04 21:31:39
【问题描述】:

我正在尝试对数据框进行子集化,以仅保留两个变量的值与先前保留的行的值不同的行。

开始
df<-structure(list(x = c("ARM018", "ARM018", "ARM018", "ARM021", 
"ARM021"), y = c("ARF014", "ARF027", "ARF028", 
"ARF014", "ARF020")), class = "data.frame", row.names = c(NA, 
-5L))

df

我想获得

df_wanted <-structure(list(x = c("ARM018", "ARM021"), y = c("ARF014", 
"ARF020")), class = "data.frame", row.names = c(NA, -2L))

df_wanted

因为 x 和 y 的值在两行中都不同

我曾假设 dplyr 包中的 lag 函数可以提供帮助 并且以下代码将返回 df_wanted 但它确实返回了预期的结果

library(dplyr)

df_attempt<-df %>% 
  filter(lag(x)!=x & lag(y)!=y)


有没有什么方法可以使用 lag 函数解决这个问题?

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

    dplyr:cumsumdplyr:lag 的组合可以解决问题:

    library(dplyr)
    df %>% mutate_all(as.character) %>% 
      filter(cumsum(x != x[1] & y != y[1]) != 
                    lag(cumsum(x != x[1] & y != y[1]), default = -1))
    
           x      y
    1 ARM018 ARF014
    2 ARM021 ARF020
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-25
      • 1970-01-01
      • 2021-08-29
      • 2017-08-03
      相关资源
      最近更新 更多