R:使用组标准

时间:2015-12-07 19:28:14

标签: r filter iteration

如果符合两个条件,我会尝试迭代删除行:

  • 斜率柱< 0
  • 环组内Lfd的最大值

Ring <- c(1, 1, 1, 1, 2, 2, 2, 2)     
Lfd <- c(1:4, 1:4)     
slope <- c(2, 2, -1, -2, 2, -1, 2, -2)     
test <- data.frame(Ring, Lfd, slope)

  Ring Lfd slope  
1    1   1     2  
2    1   2     2  
3    1   3    -1  
4    1   4    -2  
5    2   1     2  
6    2   2    -1  
7    2   3     2  
8    2   4    -2       

首次迭代后,它们应该看起来像

  Ring Lfd slope  
1    1   1     2  
2    1   2     2  
3    1   3    -1  
5    2   1     2  
6    2   2    -1  
7    2   3     2  

在第二次之后

  Ring Lfd slope  
1    1   1     2  
2    1   2     2  
5    2   1     2  
6    2   2    -1  
7    2   3     2 

我已经尝试过没有迭代了:

test_out <- test %>%
  group_by(Ring) %>%
  filter(Lfd != which.max(Lfd) & (slope > 0)) %>%
  ungroup

迭代:

del.high.neg <- function(x) {
  success <- FALSE
  while (!success) {
    test_out <- test %>%
      group_by(Ring) %>%
      filter(Lfd == which.max(Lfd)) %>%
      select(Ring, Lfd, slope) %>%
      ungroup
    Index <- test_out[test_out$slope < 0, ]
    test_out <- test_out[!(test_out$Ring %in% Index),]
    success <- Index == NULL
  }
  return(x)
}

2 个答案:

答案 0 :(得分:0)

我认为您要删除所有行为slope并且Lfd大于或等于最大值为{{1}的行的行}和非负Lfd。如果您想在slope内执行此操作,可以使用以下内容:

Ring

答案 1 :(得分:0)

我认为这就是你想要的 - 它会删除数据末尾的每一个负面行,直到它达到你的第一个正值:

library(dplyr)
test %>% group_by(Ring) %>%
         mutate(row = row_number()) %>%
         filter(row <= max(which(slope > 0)))

Source: local data frame [5 x 4]
Groups: Ring [2]

   Ring   Lfd slope   row
  (dbl) (int) (dbl) (int)
1     1     1     2     1
2     1     2     2     2
3     2     1     2     1
4     2     2    -1     2
5     2     3     2     3

如果您希望行列也消失,可以添加select(-row)