整齐地合并列或行同时应用格式

时间:2019-06-11 01:29:13

标签: r tidyverse tidyr

上下文:我正在构建一些函数,这些函数可以自动生成表并设置样式以生成报告(即后期分析工作)。我采用的方法是将数据整理成数据帧,然后将其馈送到“ flextable”以进行进一步处理。在工作流的各个点,我需要折叠行或列并应用某种格式。

在下面的示例代码中,您将找到两个数据帧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 个答案:

答案 0 :(得分:1)

从“ 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_cstr_c + unite的类似方法

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