Набор данных регистратора в R на основе страны - PullRequest
0 голосов
/ 06 февраля 2020
structure(list(Date = c("KW 52 / 2016", "KW 1 / 2017", "KW 2 / 2017", 
"KW 3 / 2017"), Sales_AT = c(150L, 169L, 143L, 170L), Sales_CH = c(150L, 
169L, 143L, 170L), Sales_GER = c(150L, 169L, 143L, 170L), Sales_HUN = c(134L, 
139L, NA, 125L), Sales_JP = c(134L, NA, 142L, 125L), Sales_POL = c(127L, 
175L, 150L, 141L), Sales_SWE = c(125L, NA, 159L, 131L), Sales_USA = c(169L, 
159L, NA, 132L), difference_AT = c(NA, 19L, -26L, 27L), difference_CH = c(NA, 
19L, -26L, 27L), difference_GER = c(NA, 19L, -26L, 27L), difference_HUN = c(NA, 
5L, NA, -14L), difference_JP = c(NA, NA, 8L, -17L), difference_POL = c(NA, 
48L, -25L, -9L), difference_SWE = c(NA, NA, 34L, -28L), difference_USA = c(NA, 
-10L, NA, -27L)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-4L))

Это мой набор данных, который выглядит следующим образом:

A tibble: 4 x 17
  Date         Sales_AT Sales_CH Sales_GER Sales_HUN Sales_JP Sales_POL Sales_SWE Sales_USA difference_AT difference_CH difference_GER difference_HUN difference_JP difference_POL difference_SWE difference_USA
  <chr>           <int>    <int>     <int>     <int>    <int>     <int>     <int>     <int>         <int>         <int>          <int>          <int>         <int>          <int>          <int>          <int>
1 KW 52 / 2016      150      150       150       134      134       127       125       169            NA            NA             NA             NA            NA             NA             NA             NA
2 KW 1 / 2017       169      169       169       139       NA       175        NA       159            19            19             19              5            NA             48             NA            -10
3 KW 2 / 2017       143      143       143        NA      142       150       159        NA           -26           -26            -26             NA             8            -25             34             NA
4 KW 3 / 2017       170      170       170       125      125       141       131       132            27            27             27            -14           -17             -9            -28            -27

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

Я ищу решение dplyr, которое работает следующим образом, но динамично c:

wide_result %>%
    select(contains("AT"), contains("CH"), contains("HUN"), contains("JP"), contains("USA"))

Кто-нибудь может мне помочь?

Ответы [ 3 ]

2 голосов
/ 06 февраля 2020

Использование базы R:

df[c(1, order(sub(".*_", "", names(df)[-1])) + 1)]
1 голос
/ 06 февраля 2020

Вот как мы можем это сделать. По сути, мы помещаем имена данных в таблицу, извлекаем часть имени после _ (когда это возможно), а затем сортируем по этому извлеченному тексту.

names_sort <- tibble(nn = names(dat)) %>%
  filter(nn != "Date") %>% # remove Date column, since we'll select that first
  # replace everything before and up to _ with ""
  mutate(names_fix = gsub(".*_", "", nn)) %>% 
  arrange(names_fix) %>%
  pull(nn)

dat %>%
  select(Date, names_sort)

#  Date         Sales_AT difference_AT Sales_CH difference_CH
#  <chr>           <int>         <int>    <int>         <int>
# 1 KW 52 / 2016      150            NA      150            NA
# 2 KW 1 / 2017       169            19      169            19
# 3 KW 2 / 2017       143           -26      143           -26
# 4 KW 3 / 2017       170            27      170            27
0 голосов
/ 06 февраля 2020

Вы можете использовать dplyr select_at:

vars <- c("CH", "AT")

df %>% 
   select_at(vars(one_of("Date", 
                         paste0("Sales_", vars), 
                         paste0("difference_", vars))))

# A tibble: 4 x 5
  Date         Sales_CH Sales_AT difference_CH difference_AT
  <chr>           <int>    <int>         <int>         <int>
1 KW 52 / 2016      150      150            NA            NA
2 KW 1 / 2017       169      169            19            19
3 KW 2 / 2017       143      143           -26           -26
4 KW 3 / 2017       170      170            27            27
...