【问题标题】:dplyr: How to slice row1 of group1, row2 of group2, row3 of group3, ...rowN of groupNdplyr:如何切片第 1 组的第 1 行、第 2 组的第 2 行、第 3 组的第 3 行、...第 N 组的城镇
【发布时间】:2021-05-31 08:38:03
【问题描述】:

这个问题的灵感来自这个问题:How to use conditional filtering of a data frame in R when trying to retain non-duplicated values in two columns

我们如何在后续组 (1,2,3,4...n) 中分割相应的行 (1,2,3,4....n)。 在这个简化的示例中,第一个数据帧应该导致第二个:

library(tidyverse)
# tibble
df <- tibble(
  group = c(1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5),
  value = c(1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 5)
)

应该导致这个

到目前为止,我已经尝试了 slice 的不同选项,例如 slice(seq(1, n(), by = 2)) 从这里:How to get every nth element from each group in a grouped data frame。 非常感谢!

【问题讨论】:

    标签: r dplyr slice


    【解决方案1】:
    df %>%
      group_by(group) %>%
      slice(cur_group_id())
    # # A tibble: 5 x 2
    # # Groups:   group [5]
    #   group value
    #   <dbl> <dbl>
    # 1     1     1
    # 2     2     2
    # 3     3     3
    # 4     4     4
    # 5     5     5
    

    【讨论】:

    • 完美。上下文相关的表达式对我来说是全新的!谢谢!
    • group_by(group1, group2)的情况下是否可以使用cur_group_id()
    • cur_group_id 将对您拥有的组进行编号,无论它们是什么,从 1 到组数。它不取决于您有多少分组列或它们的值是什么(除了组的默认排序将按分组值的升序排列)。
    【解决方案2】:

    还有一个完整的 data.table 解决方案 ;-)

    library( data.table )
    setDT(df)[, .SD[.GRP], by = group]
    

    帮助文件中的解释:
    .SD 是一个 data.table,其中包含 x 的子集 [wimpel: here x == df] 每个组的数据,不包括使用的任何列in by(或 keyby)。
    .GRP 是一个整数,长度为 1,包含一个简单的组计数器。第 1 组 1 个,第 2 组 2 个,以此类推

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 2019-06-22
      • 1970-01-01
      相关资源
      最近更新 更多