我想为变量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)
这是可行的,但我想知道是否有更简单的方法来实现同样的目标。
4条答案
按热度按时间z18hc3ub1#
您可以按组筛选值,然后进行汇总。
因此,我们只保留
b==1
或所有b==0
时每组的值h79rfbju2#
我们可以在
summarise
里面加上ifelse
,而不需要filter
B值。此外,不要在R中命名
c
。vfh0ocws3#
i7uaboj44#
输入数据:
创建于2023年1月30日,使用reprex v2.0.2