Мы можем использовать sum_
из hablar
, который будет возвращать NA
, если все значения NA
, а затем использовать dense_rank
library(dplyr)
library(hablar)
df %>%
group_by(column2) %>%
summarise(column3 = sum_(column3)) %>%
mutate(rank = dense_rank(-column3))
# A tibble: 3 x 3
# column2 column3 rank
# <chr> <int> <int>
#1 gb 14 2
#2 Hs 83 1
#3 Rd NA NA
Или использовать data.table
library(data.table)
setDT(df)[, .(column3 = sum_(column3)), column2][,
rank := frank(-column3, na.last = 'keep')][]
данные
df <- structure(list(column1 = c("a", "b", "c", "d", "e", "b", "c",
"a", "x", "z"), column2 = c("gb", "gb", "gb", "gb", "Hs", "Hs",
"Hs", "Rd", "Rd", "Rd"), column3 = c(10L, NA, NA, 4L, 81L, NA,
2L, NA, NA, NA)), class = "data.frame", row.names = c(NA, -10L
))