根据另一个变量选择分组行

问题描述 投票:0回答:1

我有一个数据集,其中每个

region
都有一个值
pos
,但某些区域的值不是 1。

region <- c('A','A','B','B','C','D','D','E')
pos <- c(0,1,0,1,0,0,1,0)
df <- data.frame(region, pos)

对于每个区域,我想选择

pos
值为 1 的行。如果有一个区域
pos
值不为 1,我想选择 0 行。因此,本质上我希望得到一个结果数据集,其中每个区域都有一行,但对于为 1 的区域,我想选择该行。每个区域的行数永远不会超过 2 行。

结果应该是这样的:

    df <
      Region pos
    1   A    1
    2   B    1
    3   C    0
    4   D    1
    5   E    0

预先感谢您的帮助。

r if-statement select dplyr aggregate
1个回答
0
投票

如果您确定所有值都是 0 和 1,您可能可以逃脱:

library(dplyr)
bind_rows(df, df) %>%
  slice_max(pos, by = region, with_ties = FALSE)
#   region pos
# 1      A   1
# 2      B   1
# 3      C   0
# 4      D   1
# 5      E   0

(我使用

bind_rows(df, df)
只是为了证明这适用于每个区域超过两行。)

如果这不安全,那么类似

df %>%
  group_by(region) %>%
  filter(row_number() == c(which(pos == 1), which(pos == 0))[1]) %>%
  ungroup()
# # A tibble: 5 × 2
#   region   pos
#   <chr>  <dbl>
# 1 A          1
# 2 B          1
# 3 C          0
# 4 D          1
# 5 E          0

在这种情况下,如果一个区域既没有

pos == 1
也没有
pos == 0
那么该区域将会消失。

© www.soinside.com 2019 - 2024. All rights reserved.