Накопление минимумов последующих переменных в одном столбце - PullRequest
0 голосов
/ 31 октября 2018

С такими данными, как прикрепленные, я хочу извлечь минимум выбранных столбцов и накапливать их в столбце (Intercept). Остальные переменные должны быть разницей между исходным значением переменной и вычитаемым минимумом. Я написал функцию, которая делает это для одного выбранного столбца, и попытался использовать purrr:map_at для вызова нескольких выбранных столбцов. Но следующий код не работает - он не только не вынимает минимумы, но и возвращает список последующих дат, хотя я, очевидно, хочу сохранить структуру data.frame.

structure(list(`2016-01-01` = c(19.612765930918, 0.0139082609319898, 
0.298043103003794, -0.217012113254805), `2016-01-02` = c(19.612765930918, 
0.153780074988214, 0.317999312583603, -0.192164881529573), `2016-01-03` = c(19.612765930918, 
0.150571795109967, 0.515644453462975, -0.269251568581305), `2016-01-04` = c(19.612765930918, 
0.142512722884255, 0.261814150174792, -0.160625206980914), `2016-01-05` = c(19.612765930918, 
0.0778498178207942, 0.464855455837326, -0.15224027496774), `2016-01-06` = c(19.612765930918, 
0.0314062544574153, 0.278014325308919, -0.19657100740319)), class = "data.frame", row.names = c("(Intercept)", 
"x1", "x2", "x3"))

min_to_base <- function(impacts, var) {
  var <- ensym(var)

  impacts %>% 
    t() %>% 
    as.data.frame() %>% 
    mutate(min = min(!!var),
           !!var := !!var - min,
           `(Intercept)` = `(Intercept)` + min) %>% 
    select(-min)
}

impacts %>% 
  map_at(c('x1', 'x2'), ~min_to_base(., .x))

1 Ответ

0 голосов
/ 31 октября 2018

Итак, вы хотите вычесть из этих столбцов минимумы x1 и x2 и добавить эти минимумы к (Intercept)? Если это так, это должно работать

library(tidyverse)

min_to_base <- function(df, cols){
  mins <- lapply(df[cols], min)
  df[cols] <- df[cols] - mins
  df['(Intercept)'] <- df['(Intercept)'] + do.call(sum, mins)
  df
}

impacts %>% 
  t %>% 
  as_tibble(rownames = 'dt') %>% 
  min_to_base(c('x1', 'x2'))


#   dt         `(Intercept)`     x1     x2     x3
#   <chr>              <dbl>  <dbl>  <dbl>  <dbl>
# 1 2016-01-01          19.9 0      0.0362 -0.217
# 2 2016-01-02          19.9 0.140  0.0562 -0.192
# 3 2016-01-03          19.9 0.137  0.254  -0.269
# 4 2016-01-04          19.9 0.129  0      -0.161
# 5 2016-01-05          19.9 0.0639 0.203  -0.152
# 6 2016-01-06          19.9 0.0175 0.0162 -0.197

Вот такой хакерский способ заставить функцию вести себя как NSE (тот же результат, что и выше).

min_to_base <- function(df, ...){
  cols <- as.character(ensyms(...))
  mins <- lapply(df[cols], min)
  df[cols] <- df[cols] - mins
  df['(Intercept)'] <- df['(Intercept)'] + do.call(sum, mins)
  df
}

impacts %>% 
  t %>% 
  as_tibble(rownames = 'dt') %>% 
  min_to_base(x1, x2)

Используемые данные:

impacts <- 
structure(list(`2016-01-01` = c(19.612765930918, 0.0139082609319898, 
0.298043103003794, -0.217012113254805), `2016-01-02` = c(19.612765930918, 
0.153780074988214, 0.317999312583603, -0.192164881529573), `2016-01-03` = c(19.612765930918, 
0.150571795109967, 0.515644453462975, -0.269251568581305), `2016-01-04` = c(19.612765930918, 
0.142512722884255, 0.261814150174792, -0.160625206980914), `2016-01-05` = c(19.612765930918, 
0.0778498178207942, 0.464855455837326, -0.15224027496774), `2016-01-06` = c(19.612765930918, 
0.0314062544574153, 0.278014325308919, -0.19657100740319)), class = "data.frame", row.names = c("(Intercept)", 
"x1", "x2", "x3"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...