【问题标题】:R: Slicing a grouped data frame conditional on a columnR:根据列对分组数据框进行切片
【发布时间】:2020-12-26 20:51:39
【问题描述】:

我有一个数据框,其中包含一个组、一个因组而异的条件以及每个组内的索引:

df <- data.frame(group = c(rep(c("A", "B", "C"), each = 3)), 
                 condition = rep(c(0,1,1), each = 3), 
                 index = c(1:3,1:3,2:4))

> df
  group condition index
1     A         0     1
2     A         0     2
3     A         0     3
4     B         1     1
5     B         1     2
6     B         1     3
7     C         1     2
8     C         1     3
9     C         1     4

我想对每个组中的数据进行切片,过滤掉除索引最低的行之外的所有数据。但是,仅当条件适用时才应应用此过滤器,即condition == 1。我的解决方案是计算每个组内索引的排名,并根据条件和排名的组合进行过滤:

df %>%
  group_by(group) %>%
  mutate(rank = order(index)) %>%
  filter(case_when(condition == 0 ~ TRUE,
                   condition == 1 & rank == 1 ~ TRUE))

# A tibble: 5 x 4
# Groups:   group [3]
  group condition index  rank
  <chr>     <dbl> <int> <int>
1 A             0     1     1
2 A             0     2     2
3 A             0     3     3
4 B             1     1     1
5 C             1     2     1

这让我想知道是否有更快的解决方案不需要单独的排名变量,并且可能使用 slice_min() 代替。

【问题讨论】:

  • 您可以使用slicewhich.min()
  • 我可能不完全理解 which.min() 是如何工作的,但这并不能说明这种情况,不是吗?

标签: r dplyr


【解决方案1】:

您可以使用filter() 保留条件为零或索引等于最小索引的所有情况。

library(dplyr)

df %>%
  group_by(group) %>%
  filter(condition == 0 | index == min(index))

# A tibble: 5 x 3
# Groups:   group [3]
  group condition index
  <chr>     <dbl> <int>
1 A             0     1
2 A             0     2
3 A             0     3
4 B             1     1
5 C             1     2

【讨论】:

    【解决方案2】:

    slice 的选项

    library(dplyr)
    df %>%
        group_by(group) %>% 
        slice(unique(c(which(condition == 0), which.min(index))))
    

    【讨论】:

    • 我有一个与 OP 非常相似的问题,但我需要应用一个函数而不是过滤。例如,使用group_map,我在分组数据框上应用自定义函数。这样可行。但是,现在,在该组中,我需要以 12 个块而不是完整的组 df 应用相同的函数。例如,如果组中有 30 行。我想以 12 的块应用该函数,即 12 +12 +6 ...所以会为同一组获得 3 个不同的输出。想知道您之前是否回答过这个问题?任何线索都会有所帮助。
    猜你喜欢
    • 2020-08-05
    • 1970-01-01
    • 2021-02-27
    • 2015-05-11
    • 1970-01-01
    • 2015-10-30
    • 2018-06-15
    • 1970-01-01
    • 2015-04-15
    相关资源
    最近更新 更多