Мутирование столбца с уникальными условиями, основанными на категоризации и квантилях - PullRequest
0 голосов
/ 30 декабря 2018
set.seed(2)
example <- tibble(Score = round(rnorm(n = 12, 100, 20), digits = 0))

   Score
   <dbl>
 1    82
 2   104
 3   132
 4    77
 5    98
 6   103
 7   114
 8    95
 9   140
10    97
11   108
12   120

То, что я хотел бы сделать, это изменить новую переменную new, которая классифицирует наименьшее число как alpha, второе наименьшее число как beta, третье по величине число ко второму квантилю какabove median, а затем два нижних квантиля как below median.

Я думал о том, чтобы сделать несколько мутаций для достижения этой цели, но мне было интересно, кто-нибудь может предложить более элегантное решение?

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

   Score new         
   <dbl> <chr>       
 1    77 alpha       
 2    82 beta        
 3    95 above median
 4    97 above median
 5    98 above median
 6   103 above median
 7   104 below median
 8   108 below median
 9   114 below median
10   120 below median
11   132 below median
12   140 below median

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Вот очень наивная реализация, использующая dplyr case_when:

library(dplyr)
library(tibble)

set.seed(2)
example <- tibble(Score = round(rnorm(n = 12, 100, 20), digits = 0))

#returns the second smallest number
second_min = function(x){
  t = which.min(x)
  temp_x = x[-t]
  m = min(temp_x)
  return(m)
}

example %>% mutate(category = case_when(Score == min(Score) ~ "alpha",
                                                       Score == second_min(Score) ~ "beta",
                                                       Score < median(Score) ~ "below_median",
                                                       Score >= median(Score) ~ "above_median"))

. Обратите внимание, что все значения, равные минимуму, будут классифицированы как «альфа», а все значения, равные второму наименьшему значению, будут классифицированы.как бета

0 голосов
/ 30 декабря 2018

Это похоже на классический вариант использования case_when из dplyr, где мы можем определить несколько условий и соответственно присвоить значения столбцу.

library(dplyr)

example %>%
  arrange(Score) %>%
  mutate(new = case_when(row_number() == 1 ~ 'alpha', 
                         row_number() == 2  ~ 'beta', 
                         Score < median(Score) ~ 'below median', 
                         TRUE ~ 'above median'))



#    Score new         
#   <dbl> <chr>       
# 1   77. alpha       
# 2   82. beta        
# 3   95. below median
# 4   97. below median
# 5   98. below median
# 6  103. below median
# 7  104. above median
# 8  108. above median
# 9  114. above median
#10  120. above median
#11  132. above median
#12  140. above median
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...