Использование скобок `{` для получения имен расширенных столбцов в dplyr - PullRequest
0 голосов
/ 28 августа 2018
stocksm <- structure(list(time = structure(c(14245, 14246, 14247, 14248, 
14249, 14250, 14251, 14252, 14253, 14254, 14245, 14246, 14247, 
14248, 14249, 14250, 14251, 14252, 14253, 14254, 14245, 14246, 
14247, 14248, 14249, 14250, 14251, 14252, 14253, 14254), class = "Date"), 
stock = c("X", "X", "X", "X", "X", "X", "X", "X", "X", "X", 
"Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Z", "Z", 
"Z", "Z", "Z", "Z", "Z", "Z", "Z", "Z"), price = c(0.239252107606609, 
-1.56883100623924, 0.712087445800904, 0.0978227160929474, 
-0.591439041236675, -0.430019034335168, 0.033727039296972, 
-0.172634546678134, -1.30235342173481, 0.0186726500971933, 
3.13359212567755, -3.1308982249284, -0.00666262981780505, 
0.446884242347021, 0.865122586467621, -0.283571611040151, 
-0.108833395864396, -2.18319153514799, -0.27483222045657, 
0.445347442843193, -2.86909424204074, -3.46188641965012, 
0.144189534381867, -14.8137095357316, -2.11457178683177, 
3.23603451612312, -2.79876705700199, 0.824675151918647, -2.44132963041655, 
-2.97946926198463)), row.names = c(NA, -30L), class = "data.frame")

Я хочу написать dplyr функцию, которая выполняла бы некоторые операции только с spread ed функцией. У меня есть код ниже, который я хотел бы обобщить. Но так как я хочу расширить произвольно введенный столбец, мне нужен другой способ захвата его подгрупп, кроме unique(.$stock), поскольку я не могу использовать подмножество $ с произвольным var.

stocksm %>% {
  variables <- unique(.$stock)
  spread(., stock, price) %>% mutate_at(vars(variables), ~.)
}

Я имею в виду такую ​​функцию:

mutate_subgroups <- function(data, var){
  var <- enquo(var)

  data %>% {
    variables <- . %>% pull(!! var) %>% unique()
    spread(., data, value) %>% mutate_at(vars(variables), ~.)
  }
}

Но . %>% pull(stock) %>% unique() оценивается как:

Ошибка: variables должен вычислять позиции или имена столбцов, а не функцию

Итак, как я могу получить имена переменных, которые могут быть использованы в mutate_at? А почему на самом деле . %>% pull(stock) %>% unique() не работает?

1 Ответ

0 голосов
/ 28 августа 2018

Вы можете попробовать это

mutate_subgroups <- function(data){
 data %>% 
 spread(stock, price) %>% 
  mutate_at(vars(-matches(paste(colnames(data), collapse = "|"))),~.+100)}

mutate_subgroups(stocksm)
         time         X         Y         Z
1  2009-01-01 100.23925 103.13359  97.13091
2  2009-01-02  98.43117  96.86910  96.53811
3  2009-01-03 100.71209  99.99334 100.14419
4  2009-01-04 100.09782 100.44688  85.18629
5  2009-01-05  99.40856 100.86512  97.88543
6  2009-01-06  99.56998  99.71643 103.23603
7  2009-01-07 100.03373  99.89117  97.20123
8  2009-01-08  99.82737  97.81681 100.82468
9  2009-01-09  98.69765  99.72517  97.55867
10 2009-01-10 100.01867 100.44535  97.02053

Идея состоит в том, чтобы исключить имена столбцов родительского data.frame, используя -matches. Добавлено +100, чтобы проиллюстрировать эффект только для расширенных выходных столбцов.

Если вам нужен подход, подобный вашему коду, вы можете попробовать это. Поскольку variables - это вектор, который вам необходимо использовать syms для успешного вызова mutate_at

mutate_subgroups <- function(data, var){
  var <- enquo(var)
  variables <- data %>% 
                pull(!!var) %>% 
                unique()
  data %>% 
    spread(., stock, price) %>% 
    mutate_at(vars(!!!rlang::syms(variables)), ~.+100)
}
mutate_subgroups(stocksm, stock)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...