Как преобразовать числа в буквы на основе фактического порядка значений? - PullRequest
3 голосов
/ 21 мая 2019

Я думаю, что это должно быть довольно простой проблемой, но я не могу понять ответ.По сути, я хочу добавить префикс к значениям столбца, но без использования условных выражений любого типа.Возможно ли это?

то есть, я хочу что-то, что дает тот же результат, что и

mtcars %>% 
  mutate(new_cyl = str_c(case_when(cyl == 6 ~ letters[1],
                                   cyl == 4 ~ letters[2],
                                   cyl == 8 ~ letters[3]), ") ", cyl))

Но без использования case_when или каких-либо других условных.

Мое ожидаемоеoutput будет добавлять что-то (в данном случае буквы) к значениям столбца в порядке их появления.Вот как это выглядит:

enter image description here

Ответы [ 3 ]

4 голосов
/ 21 мая 2019

Вы можете сделать небольшую таблицу поиска префиксов. Таким образом, вы знаете, что вы правильно сопоставляете значения цилиндров с их префиксами, а не в зависимости от порядка правильности данных. Затем присоедините поиск к своим данным и вставьте.

library(dplyr)

lookup <- data.frame(
  cyl = c(6, 4, 8),
  prefix = letters[1:3]
)

Для случая, когда вы хотите создать префиксы на основе порядка столбца cyl, а не жестко кодировать значения cyl для их префиксов, вы можете создать таблицу поиска более динамически, например:

lookup <- data.frame(
  cyl = unique(mtcars$cyl),
  prefix = letters[seq_along(unique(mtcars$cyl))]
)

# select is just to get extra columns out of the way to show here
mtcars %>%
  select(cyl) %>%
  left_join(lookup, by = "cyl") %>%
  mutate(new_cyl = paste(prefix, cyl, sep = ") ")) %>%
  head()
#>   cyl prefix new_cyl
#> 1   6      a    a) 6
#> 2   6      a    a) 6
#> 3   4      b    b) 4
#> 4   6      a    a) 6
#> 5   8      c    c) 8
#> 6   6      a    a) 6
2 голосов
/ 21 мая 2019

Если вы хотите назначить букву всем значениям "цил":

mtcars %>%
 mutate(new_cyl = paste0(letters[cyl], ") ", cyl))

    mpg cyl  disp  hp drat    wt  qsec vs am gear carb new_cyl
1  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4    f) 6
2  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4    f) 6
3  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1    d) 4
4  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1    f) 6
5  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2    h) 8
6  18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1    f) 6
7  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4    h) 8
8  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2    d) 4
9  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2    d) 4
10 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4    f) 6

Чтобы назначить буквы на основе фактического порядка значений "цил":

mtcars %>%
 mutate(dup = cumsum(!duplicated(cyl))) %>%
 group_by(cyl) %>%
 mutate(dup = first(dup),
        new_cyl = paste0(letters[dup], ") ", cyl)) %>%
 ungroup() %>%
 select(-dup) 

     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb new_cyl
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>  
 1  21       6 160     110  3.9   2.62  16.5     0     1     4     4 a) 6   
 2  21       6 160     110  3.9   2.88  17.0     0     1     4     4 a) 6   
 3  22.8     4 108      93  3.85  2.32  18.6     1     1     4     1 b) 4   
 4  21.4     6 258     110  3.08  3.22  19.4     1     0     3     1 a) 6   
 5  18.7     8 360     175  3.15  3.44  17.0     0     0     3     2 c) 8   
 6  18.1     6 225     105  2.76  3.46  20.2     1     0     3     1 a) 6   
 7  14.3     8 360     245  3.21  3.57  15.8     0     0     3     4 c) 8   
 8  24.4     4 147.     62  3.69  3.19  20       1     0     4     2 b) 4   
 9  22.8     4 141.     95  3.92  3.15  22.9     1     0     4     2 b) 4   
10  19.2     6 168.    123  3.92  3.44  18.3     1     0     4     4 a) 6

Вот оново-первых, создает накопленную сумму не повторяющихся значений «цил».Во-вторых, он группируется по «цил».Наконец, он берет первое значение кумулятивной суммы неповторяющихся значений и присваивает ему букву.

1 голос
/ 22 мая 2019

Вы можете использовать factor() для маркировки:

mtcars %>%
  mutate(
    new_cyl = paste(factor(x, unique(x), letters[seq(unique(x))]), cyl, sep = ') ')
  )

Выход (напор):

#    mpg cyl disp  hp drat    wt  qsec vs am gear carb new_cyl
# 1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4    a) 6
# 2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4    a) 6
# 3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1    b) 4
# 4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1    a) 6
# 5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2    c) 8
# 6 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1    a) 6

Обобщается как функция:

append_prefix <- function(x, sort = F){
  out <- paste(factor(x, unique(x), letters[seq(unique(x))]), x, sep = ') ')
  if(sort) out <- paste(factor(x, sort(unique(x)), letters[seq(unique(x))]), x, sep = ') ')
  return(out)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...