繁体   English   中英

R:根据一列中的条件过滤行

[英]R: filter rows based on a condition in one column

我有一个 dataframe:

a<-c(1,1,1,1,1,1,1,1,1,1,1)
b<-c(100,100,100,100,100,100,100,100,100,100,100)
c<-c(1,3,1,1,3,1,1,3,1,1,3)
d<-c(3400,3403,3407,3408,3412,3423,3434,3436,3445,3454,3645)
df<-data.frame(d,b,c,a)
df
      d   b c a
1  3400 100 1 1
2  3403 100 3 1
3  3407 100 1 1
4  3408 100 1 1
5  3412 100 3 1
6  3423 100 1 1
7  3434 100 1 1
8  3436 100 3 1
9  3445 100 1 1
10 3454 100 1 1
11 3645 100 3 1

并且我想始终过滤满足以下条件的行对:第一行的列 c 值必须为 3,第二行的列 c 值必须为 1,并且该对之间的列 d 值必须为 < 10. 所以这个例子中预期的 output 应该是:

      d   b c a
2  3403 100 3 1
3  3407 100 1 1
8  3436 100 3 1
9  3445 100 1 1

我尝试了以下方法:

filter(df,first(c)==3,nth(c,2)==1,any(diff(d) < 10))

但由于某种原因,它不起作用。 谢谢你的帮助!

您可以首先使用which建立第一对零件的索引:

library(dplyr)
inds <- which(df$c == 3 & lead(df$c) == 1 & lead(df$d) - df$d < 10)

然后在索引上将 dataframe 子集1:

df[sort(unique(c(inds, inds + 1))),]
     d   b c a
2 3403 100 3 1
3 3407 100 1 1
8 3436 100 3 1
9 3445 100 1 1

或者,您可以执行以下操作:

library(dplyr)
df1 <- df %>%                                        # get the first row
  filter(c == 3 & lead(c) == 1 & lead(d) - d < 10) 
df2 <- df %>%                                        # get the second row
  filter(lag(c) == 3 & c == 1 & d - lag(d) < 10)
arrange(rbind(df1, df2), d)                          # bind the two together and arange by d

以下代码并不简单,但它产生了预期的结果。

library(dplyr)

df %>%
  mutate(flag = cumsum(c == 3)) %>%
  group_by(flag) %>%
  slice_head(n = 2) %>%
  filter(n() > 1) %>%
  mutate(flag = flag*(diff(d) < 10)) %>%
  ungroup() %>%
  filter(flag > 0) %>%
  select(-flag)
## A tibble: 4 x 4
#      d     b     c     a
#  <dbl> <dbl> <dbl> <dbl>
#1  3403   100     3     1
#2  3407   100     1     1
#3  3436   100     3     1
#4  3445   100     1     1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM