r case_when, упорядочить и% как% - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть следующие данные:

library(dplyr)

d <- tibble(
region = c('West Duns', 'West Alpha', 'East fun', 'East Hull',
         'Jess One', 'Jess Two'),
 figures= c(5, 7, 4, 8, 7, 6))

Я бы хотел, чтобы данные выглядели так:

 d <- tibble(
   region = c('Jess One', 'Jess Two','West Alpha', 'West Duns' 
            'East Fun', 'East Hull'),
figures= c(7, 6, 5, 7, 4, 8)) 

И я знаю, что могу сделать это, используя:

 d %>%
 arrange(factor(.$region, levels = c('Jess One', 'Jess Two','West Alpha', 
'West Duns' ,'East Fun', 'East Hull'))) -> d2

Но что происходит, когда у меня действительно длинные данные, означающие, что потребовались бы годы, чтобы определить каждый фактор? Я хотел бы использовать case when и %like% в аргументе. Так было бы что-то вроде этого:

 d2 %>%
 arrange(factor(.$region, case_when (levels = c(%like% "Jess", %like% 
 "West", %like% "East"))) -> d2

Таким образом, факторы упорядочены по первому слову, данному в утверждении, а затем в алфавитном порядке по второму слову в множителе. Я думаю, что алфавитное упорядочение произойдет естественным образом, так что это больше, как использовать аргументы case_when и %like, с которыми мне нужна помощь.

Спасибо

Ответы [ 2 ]

3 голосов
/ 26 апреля 2019

Вот один вариант, используя stringr::word и forcats::fct_relevel

library(tidyverse)
d %>% group_by(reg=word(region)) %>% ungroup() %>% 
      mutate(reg_fac=fct_relevel(reg,'Jess','West','East')) %>% arrange(reg_fac)

Мы можем шортить выше

library(tidyverse)
d %>% arrange(fct_relevel(word(region),'Jess','West','East')) 

# A tibble: 6 x 2
   region     figures
    <chr>        <dbl>
1 Jess One         7
2 Jess Two         6
3 West Duns        5
4 West Alpha       7
5 East fun         4
6 East Hull        8

Используя base::factor

d %>% dplyr::arrange(factor(gsub('(.*)\\s.*','\\1',.$region), 
                            levels = c('Jess','West','East')))
0 голосов
/ 26 апреля 2019
d %>% 
  arrange(max.col(outer(region, c('Jess', 'West', 'East'), startsWith)))

# # A tibble: 6 x 2
#   region     figures
#   <chr>        <dbl>
# 1 Jess One         7
# 2 Jess Two         6
# 3 West Duns        5
# 4 West Alpha       7
# 5 East fun         4
# 6 East Hull        8

outer из region и ваш вектор имен с использованием startsWith дает матрицу, элемент ij которой равен TRUE, если region i начинается с имени j.Затем max.col дает индекс первого столбца с TRUE для каждой строки, то есть индекс элемента вектора ваших имен, с которого начинается данный элемент региона.

Если вы хотите выполнить поиск по всей строкевместо только начала вы можете заменить startsWith на Vectorize('%like%').

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...