Принуждение .name_repair к созданию имен - PullRequest
1 голос
/ 10 ноября 2019

У меня есть данные df_single и df_multi. df_multi прекрасно работает, но у меня возникают проблемы, когда я применяю те же данные к df_single

Я запускаю следующий код:

df_single %>% 
  as_tibble(., .name_repair = "universal") %>% 
  summarise_at(.vars = 8:ncol(.), .funs = c(mean = "mean", sd = "sd"))

, который дает мне следующее:

# A tibble: 1 x 2
   mean    sd
  <dbl> <dbl>
1  42.4 0.380

Это хорошо, но не в правильном формате. Я хочу, чтобы он был в нем. Если я запускаю следующее:

df_multi %>% 
  as_tibble(., .name_repair = "universal") %>% 
  summarise_at(.vars = 8:ncol(.), .funs = c(mean = "mean", sd = "sd"))

Я получаю:

# A tibble: 1 x 8
  pza_del_carmen_… pza_de_espana_m… escuelas_aguirr… retiro_mean pza_del_carmen_… pza_de_espana_sd
             <dbl>            <dbl>            <dbl>       <dbl>            <dbl>            <dbl>
1             29.5             23.8             31.8        11.8             21.2             18.3
# … with 2 more variables: escuelas_aguirre_sd <dbl>, retiro_sd <dbl>

Который в правильном формате, я хочу, чтобы он был в.

Мой ожидаемый результат от df_single будет:

# A tibble: 1 x 2
   tres_olivos_mean    tres_olivos_sd
  <dbl>                  <dbl>
1  42.4                  0.380

Откуда пришло имя. Я обнаружил, что «проблема» возникает из .name_repair =, поскольку в именах столбцов в данных df_signle нет конфликта. Глядя на df_single:

# A tibble: 6 x 8
  date         day month  year quarter semester weekday tres_olivos
  <date>     <int> <dbl> <dbl>   <int>    <int>   <dbl>       <dbl>
1 2010-01-01     1     1  2010       1        1       0        42.9
2 2010-01-02     2     1  2010       1        1       0        42.7
3 2010-01-03     3     1  2010       1        1       0        42.5
4 2010-01-04     4     1  2010       1        1       0        42.3
5 2010-01-05     5     1  2010       1        1       0        42.1
6 2010-01-06     6     1  2010       1        1       0        41.9

Я хочу взять tres_olivos из интересующей колонки. df_multi выглядит следующим образом:

# A tibble: 6 x 11
  date         day month  year quarter semester weekday pza_del_carmen pza_de_espana escuelas_aguirre retiro
  <date>     <int> <dbl> <dbl>   <int>    <int>   <dbl>          <dbl>         <dbl>            <dbl>  <dbl>
1 2010-01-01     1     1  2010       1        1       0              6             4               18      3
2 2010-01-02     2     1  2010       1        1       0             26            20               28      9
3 2010-01-03     3     1  2010       1        1       0             51            50               41     22
4 2010-01-04     4     1  2010       1        1       0             57            39               48     21
5 2010-01-05     5     1  2010       1        1       0             29            25               37     12
6 2010-01-06     6     1  2010       1        1       0              8             5               19      4

Данные:

df_single <- structure(list(date = structure(c(14610, 14611, 14612, 14613, 
14614, 14615), class = "Date"), day = 1:6, month = c(1, 1, 1, 
1, 1, 1), year = c(2010, 2010, 2010, 2010, 2010, 2010), quarter = c(1L, 
1L, 1L, 1L, 1L, 1L), semester = c(1L, 1L, 1L, 1L, 1L, 1L), weekday = c(0, 
0, 0, 0, 0, 0), tres_olivos = c(42.8840939928959, 42.6809748158197, 
42.4778556387312, 42.2747364616426, 42.0716172845541, 41.8684981074656
)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-6L))

df_multi <- structure(list(date = structure(c(14610, 14611, 14612, 14613, 
14614, 14615), class = "Date"), day = 1:6, month = c(1, 1, 1, 
1, 1, 1), year = c(2010, 2010, 2010, 2010, 2010, 2010), quarter = c(1L, 
1L, 1L, 1L, 1L, 1L), semester = c(1L, 1L, 1L, 1L, 1L, 1L), weekday = c(0, 
0, 0, 0, 0, 0), pza_del_carmen = c(6, 26, 51, 57, 29, 8), pza_de_espana = c(4, 
20, 50, 39, 25, 5), escuelas_aguirre = c(18, 28, 41, 48, 37, 
19), retiro = c(3, 9, 22, 21, 12, 4)), class = c("tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -6L))

РЕДАКТИРОВАТЬ: Из документации

Аргумент .name_repair в tibble () иas_tibble () относится к этим уровням. Кроме того, пользователь может передать свою собственную функцию восстановления имени. Он должен предвосхищать минимальные имена в качестве входных данных и также должен возвращать имена, по крайней мере, минимальные.

Может быть интересно передать мою собственную функцию восстановления имен.

Редактировать:

Вот как выглядят данные:

my_list <- list(list(structure(list(date = structure(c(14610, 14611, 14612, 
14613, 14614, 14615), class = "Date"), day = 1:6, month = c(1, 
1, 1, 1, 1, 1), year = c(2010, 2010, 2010, 2010, 2010, 2010), 
    quarter = c(1L, 1L, 1L, 1L, 1L, 1L), semester = c(1L, 1L, 
    1L, 1L, 1L, 1L), weekday = c(0, 0, 0, 0, 0, 0), pza_del_carmen = c(6, 
    26, 51, 57, 29, 8), pza_de_espana = c(4, 20, 50, 39, 25, 
    5), escuelas_aguirre = c(18, 28, 41, 48, 37, 19), retiro = c(3, 
    9, 22, 21, 12, 4)), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -6L)), structure(list(date = structure(c(14611, 
14612, 14613, 14614, 14615, 14616), class = "Date"), day = 2:7, 
    month = c(1, 1, 1, 1, 1, 1), year = c(2010, 2010, 2010, 2010, 
    2010, 2010), quarter = c(1L, 1L, 1L, 1L, 1L, 1L), semester = c(1L, 
    1L, 1L, 1L, 1L, 1L), weekday = c(0, 0, 0, 0, 0, 0), pza_del_carmen = c(26, 
    51, 57, 29, 8, 22), pza_de_espana = c(20, 50, 39, 25, 5, 
    12), escuelas_aguirre = c(28, 41, 48, 37, 19, 26), retiro = c(9, 
    22, 21, 12, 4, 7)), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -6L))), list(structure(list(date = structure(c(14610, 
14611, 14612, 14613, 14614, 14615), class = "Date"), day = 1:6, 
    month = c(1, 1, 1, 1, 1, 1), year = c(2010, 2010, 2010, 2010, 
    2010, 2010), quarter = c(1L, 1L, 1L, 1L, 1L, 1L), semester = c(1L, 
    1L, 1L, 1L, 1L, 1L), weekday = c(0, 0, 0, 0, 0, 0), tres_olivos = c(42.8840939928959, 
    42.6809748158197, 42.4778556387312, 42.2747364616426, 42.0716172845541, 
    41.8684981074656)), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -6L)), structure(list(date = structure(c(14611, 
14612, 14613, 14614, 14615, 14616), class = "Date"), day = 2:7, 
    month = c(1, 1, 1, 1, 1, 1), year = c(2010, 2010, 2010, 2010, 
    2010, 2010), quarter = c(1L, 1L, 1L, 1L, 1L, 1L), semester = c(1L, 
    1L, 1L, 1L, 1L, 1L), weekday = c(0, 0, 0, 0, 0, 0), tres_olivos = c(42.6809748158197, 
    42.4778556387312, 42.2747364616426, 42.0716172845541, 41.8684981074656, 
    41.6653789303771)), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -6L))))

Я попытался максимально скопировать исходный список, используя:

mylist <- list(
  list(head(map(rolled_splits[[2]]$splits, ~ analysis(.x))[[1]]),
       head(map(rolled_splits[[2]]$splits, ~ analysis(.x))[[2]])),
  list(head(map(rolled_splits[[3]]$splits, ~ analysis(.x))[[1]]),
       head(map(rolled_splits[[3]]$splits, ~ analysis(.x))[[2]]))
)

1 Ответ

1 голос
/ 10 ноября 2019

Здесь небольшой трюк, который мы можем сделать, так как имя одного столбца получит имя функции по умолчанию, см. Раздел ?summarise_at

library(dplyr)
df_single %>% 
   summarise_at(.vars = 7:ncol(.), .funs = c(mean = "mean", sd = "sd")) %>% 
   rename_all(~paste0('_',.))

# A tibble: 1 x 2
  tres_olivos_mean tres_olivos_sd
             <dbl>          <dbl>
1             42.4          0.380

Из ?summarise_at Имена :

Имена созданных столбцов получаются из имен входных переменных и имен функций.

  • , если существует только одна безымянная переменная, именафункции используются для именования созданных столбцов.


map(my_list, ~map(.,~if(ncol(.)>8) .x %>% summarise_at(.vars = 7:ncol(.), .funs = c(mean = "mean", sd = "sd")) 
                     else .x %>% summarise_at(.vars = 7:ncol(.), .funs = c(mean = "mean", sd = "sd")) %>% select(2,4)))

#A robust solution is to depend on names rather than positions 
summarise_fun <- function(df){
  #browser()
  nms <- setdiff(names(df), c("date", "day", "month", "year", "quarter", "semester", "weekday"))
  if(length(nms)>1){
    df %>% summarise_at(.vars = nms, .funs = c(mean = "mean", sd = "sd"))
  }else{
    df %>% summarise_at(.vars = nms, .funs = c(mean = "mean", sd = "sd")) %>% rename_all(~paste0(nms,'_',.))
  }
}

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