我想为变量a创建的每个组选择一行。它应该是变量c具有最高值的行,但如果变量b为 TRUE,则应选择该组内 b = TRUE 且 c 最大的行。
我有以下代码:
set.seed(42)
a <- rep(1:3, each = 3)
b <- sample(c(0,1), size = 9, replace = T)
c <- sample(1:9, size = 9, replace = F)
df <- data.frame(a = a,
b = b,
c = c)
df %>% group_by(a) %>% filter(b == 1) %>%
arrange(desc(c), .by_group = T) %>%
summarise_all(function(x) x[1]) -> df1
df %>% group_by(a) %>% filter(all(b != 1)) %>%
arrange(desc(c), .by_group = T) %>%
summarise_all(function(x) x[1]) -> df2
df3 <- rbind(df1, df2)
Run Code Online (Sandbox Code Playgroud)
这是可行的,但我想知道是否有更简单的方法来实现相同的目的。
您可以过滤组的值,然后进行汇总。
df %>%
group_by(a) %>%
filter(all(b==0) | b==1) %>%
summarize(b = first(b), c = max(c))
# a b c
# <int> <dbl> <int>
# 1 1 0 8
# 2 2 1 5
# 3 3 1 9
Run Code Online (Sandbox Code Playgroud)
所以我们只保留每组的值,如果b==1或者如果所有b==0