Tidy объединить столбцы или строки одновременно применять форматы - PullRequest
1 голос
/ 11 июня 2019

Контекст: я работаю над созданием некоторых функций, которые автоматизируют генерацию таблиц и стили для генерации отчетов (т. Е. Аналитическая работа на поздней стадии). Подход, который я использую, состоит в том, чтобы поместить мои данные в фреймы данных, которые я передам в «гибкий» для дальнейшей обработки. На разных этапах рабочего процесса мне нужно свернуть строки или столбцы и применить некоторое форматирование.

В приведенном ниже примере кода вы найдете два фрейма данных, long_df и wide_df, я бы хотел, чтобы они выглядели как соответствующие целевые фреймы данных. Я застрял на подходе.

Я подумал, что, может быть, 'tidyr :: unite' или использовал вставку в 'dplyr :: mutate' в длинном виде. Любые советы будут оценены.

library(tibble)

long_df <- tribble(
  ~Statistc, ~Model_1, ~Model_2,
  'G2',       413.42,  532.93,
  'df',       2,       3,
  'CFI',      .95,     .91,
)


wide_df <- tribble(
  ~model,     ~G2,     ~df,  ~CFI,
  'Model_1',  413.42,  2,   .95, 
  'Model_2',  532.93,  3,   .91, 
)


target_wide_df <- tribble(
  ~model,   ~'G2 (df)',    ~CFI,
  'Model_1',  '413.42 (2)',  .95, 
  'Model_2',  '532.93 (3)',  .91, 
)

target_long_df <- tribble(
  ~Statistc,   ~Model_1,    ~Model_2,
  'G2 (df)',   '413.42 (2)',  '532.93 (3)',
  'CFI',      .95,          .91,
)

1 Ответ

1 голос
/ 11 июня 2019

Из 'long_df' мы можем сделать

library(tidyverse)
long_df %>%
    group_by(grp = rep(1:2, 2:1)) %>% 
    summarise_all(list(~ if(n() > 1) str_c(.[1], ' (', .[2], ')') 
          else as.character(.))) %>%
    ungroup %>%
    select(-grp)

Начиная с wide_df, можно попробовать аналогичный подход с str_c или str_c + unite

wide_df %>%
     unite(`G2 (df)`, G2, df, sep=" (") %>% 
     mutate(`G2 (df)` = str_c(`G2 (df)`, ')')) 
...