在dplyr中获得最小值

时间:2019-02-01 20:41:04

标签: r dplyr

我想用dplyr写一个代码,我可以取最小值2 连续的行

A <- data.frame(
  y = c("A", "B", "C", "D", "E", "F"), 
  value = c(1, 2, 3, 4, 5, 6))
A
#   y value
# 1 A     1
# 2 B     2
# 3 C     3
# 4 D     4
# 5 E     5
# 6 F     6

所需的输出

y value    
A 1    
C 3    
E 5

我想使用dplyr包

常规代码我使用按名称分组是

z <- x %>%    
  group_by(name)%>%
  filter(value == min(value))

我想不出“如何在R或dplyr中编码“连续行”

2 个答案:

答案 0 :(得分:3)

您只需要创建一个适当的分组变量:

A %>% mutate(grp = rep(0:(n() - 1) %/% 2 ) %>%
  group_by(grp) %>%
  slice(which.min(x))
# # A tibble: 3 x 3
# # Groups:   grp [3]
#   y         x   grp
#   <fct> <dbl> <int>
# 1 A         1     1
# 2 C         3     2
# 3 E         5     3

答案 1 :(得分:2)

一个稍微不同的tidyverse的可能性可以是:

A %>%
 group_by(grp = gl(length(value)/2, 2)) %>%
 filter(value == min(value))

  y     value grp  
  <fct> <dbl> <fct>
1 A        1. 1    
2 C        3. 2    
3 E        5. 3

它创建使用gl(),基团通过其分组变量,然后保持最小值。

或者使用相同的逻辑,但是通过创建组row_number()

A %>%
 group_by(grp = (row_number()-1) %/% 2) %>%
 filter(value == min(value)) 

或者使用top_n(),而不是filter()

A %>%
 group_by(grp = gl(length(value)/2, 2)) %>%
 top_n(-1, wt = value)

或者:

A %>%
 group_by(grp = (row_number()-1) %/% 2) %>%
 top_n(-1, wt = value)