суммировать значения столбца (group_by), сохраняя значения NA и не заменяя нулем в R - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь суммировать группу значений столбца по другому столбцу, мне нужно сохранить значения NA, я не должен заменять значения на ноль, потому что исходя из суммы, которую я должен дать Rank, если sum равен NA, ранг должен быть пустым.

ниже приведен пример для понимания проблемы

column1 column2 column3

a gb 10

b gb NA

c gb NA

d gb 4

e Hs 81

b Hs NA

c Hs 2

a Rd NA

x Rd NA

z Rd NA

Я должен суммировать значения столбца group3 по column2 и при суммировании не должен принимать во внимание значения NA и суммировать другие значения для этого Группа I не должна удалять или заменять значения NA на ноль. исходя из этой суммы, я должен присвоить ранг, если сумма равна NA (см. группу Rd), для этого не будет ранга. Я могу заменить значения NA на ноль, но я должен дать ранг за суммой, если сумма равна NA, ранг будет пустым (в случае группы Rd из приведенных выше данных). и для группы gb значение суммы равно 14, а значение суммы группы Hs равно 83, а значение суммы группы Rd равно NA, в этом случае для группы не будет ранга.

ниже приведен фрагмент кода, который я пробовал

df%>% group_by_at (column2)%>% суммировать (sum = sum (column3, na.rm = TRUE))

выше кода суммировать значения путем замены всех NA на ноль, но я не не хочу заменить. Я нуждаюсь в NA в присвоении ранга Можете ли вы предоставить какое-либо решение для этого.

ожидаемый результат:

column2 column3 rank

gb 14 2

Hs 83 1

Rd NA Нет рейтинга

Ответы [ 3 ]

0 голосов
/ 17 апреля 2020

Мы можем использовать 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
))
0 голосов
/ 17 апреля 2020

Базовый раствор R:

within(aggregate(column3~column2, df, FUN = function(x){
    ifelse(all(is.na(x)), NA_integer_, sum(x, na.rm = TRUE))}, 
    na.action = na.pass), {rank = ifelse(is.na(column3), NA_integer_,
                                         rank(-column3))})
0 голосов
/ 17 апреля 2020

Вы можете использовать rank с na.last = "keep", чтобы дать rank как NA

library(dplyr)

df %>% 
  group_by(column2) %>% 
  summarise(column3 = if(all(is.na(column3))) NA else 
                         sum(column3, na.rm = TRUE)) %>%
  ungroup %>%
  mutate(rank = rank(-column3, na.last = "keep"))

#  column2 column3  rank
#  <fct>     <int> <dbl>
#1 gb           14     2
#2 Hs           83     1
#3 Rd           NA    NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...