【问题标题】:Getting minimum value in dplyr在 dplyr 中获取最小值
【发布时间】:2019-02-01 20:41:04
【问题描述】:

我想在 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 中编码“连续行”

【问题讨论】:

  • 通过突出显示代码并单击编辑器中的“代码格式”按钮 ({}) 或将其缩进 4 个空格,将代码格式化为代码。

标签: r dplyr


【解决方案1】:

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

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

【讨论】:

  • 在原始数据上出现错误,请您解释一下代码,以便我可以使用
  • 或者另一个选项是A %&gt;% group_by(y = replace(y, c(FALSE, TRUE), y[c(TRUE, FALSE)])) %&gt;% summarise(value = min(value))
  • 在您的示例数据上一次运行一行以帮助理解。首先,我们创建一个名为grp 的新列,它是连续行的分组列。然后我们按该列分组。然后,在每个组中,我们slice 对应于最小 x 值的行。如果您需要更多帮助,请编辑您的问题以至少包含您收到的错误消息。最好有足够的样本数据来重现错误。
  • 我不理解天花板部分。这个错误我得到 slice_impl(.data, dots) 中的错误:评估错误:(列表)对象不能被强制输入“双”。
  • 代码运行良好,直到 A %>% mutate(grp = rep(1:ceiling(n() / 2), each = 2)) %>% group_by(grp) %>% 但是当我尝试切片时会出错
【解决方案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)

【讨论】:

  • 不错的品种!我认为您需要 gl(ceiling(n() / 2), 2, length = n()) 之类的东西才能使 gl 处理奇数行。
  • 还值得指出细微的差别:filter(value == min(value)) 将保留 all 行与最小值,如果有平局。 top_n 就像 slice 一样,它总是每组 1 行。
  • @Gregor 感谢您的发言。是的,对于奇数,可以使用您建议的内容。
猜你喜欢
  • 1970-01-01
  • 2021-05-18
  • 2017-05-30
  • 2021-06-02
  • 2020-03-28
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 2021-11-28
相关资源
最近更新 更多