我有一个数据集,其中每个
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
预先感谢您的帮助。
如果您确定所有值都是 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
那么该区域将会消失。