处理来自"宽"的数据。到"长"格式绘制均值和标准误差

时间:2017-01-31 03:15:21

标签: r tidyr

我有一个data.frame,其中包含var1var2两个变量的均值和标准误差。

data.frameoriginal_df来自为两组中的每一组的数据创建这些统计信息:

original_df <- data.frame(group_dummy_code = c(0, 1),
           var1_mean = c(1.5, 2.5),
           var1_se = c(.025, .05),
           var2_mean = c(3.5, 4.5),
           var2_se = c(.075, .1))

> original_df
  group_dummy_code var1_mean var1_se var2_mean var2_se
1                0       1.5   0.025       3.5   0.075
2                1       2.5   0.050       4.5   0.100

我尝试使用tidyr函数gather()data.frame更改为desired_df,以便绘制两个变量&#39;手段和标准错误:

desired_df <- data.frame(group_dummy_code = c(0, 1, 0, 1),
                         key = c("var1", "var1", "var2", "var2"),
                         val_mean = c(1.5, 2.5, 3.5, 4.5),
                         val_se = c(.025, .05, .075, .1))

> desired_df
  group_dummy_code  key val_mean val_se
1                0 var1      1.5  0.025
2                1 var1      2.5  0.050
3                0 var2      3.5  0.075
4                1 var2      4.5  0.100

我尝试gather()两次以下内容:

df %>%
    gather(mean_key, mean_val, -group_dummy_code, -contains("se")) %>% 
    gather(se_key, se_val, -group_dummy_code, -mean_key, -mean_val)

但是,这导致行太多(特别是每个均值有多个标准错误):

  group_dummy_code  mean_key mean_val  se_key se_val
1                0 var1_mean      1.5 var1_se  0.025
2                1 var1_mean      2.5 var1_se  0.050
3                0 var2_mean      3.5 var1_se  0.025
4                1 var2_mean      4.5 var1_se  0.050
5                0 var1_mean      1.5 var2_se  0.075
6                1 var1_mean      2.5 var2_se  0.100
7                0 var2_mean      3.5 var2_se  0.075
8                1 var2_mean      4.5 var2_se  0.100

这似乎是一个相当常见的处理步骤,特别是在创建了许多变量的均值和标准差的统计数据之后,但gather()两次 - 一次为均值,一次为标准误差变量 - -doesn似乎是一个很好的方法。

使用tidyr(或dplyr或其他套餐),如何从desired_df创建original_df

1 个答案:

答案 0 :(得分:1)

tidyr::gather()不提供重塑具有多值列的数据框的功能,如果您想坚持tidyr,则可以使用gather-separate-spread执行此操作:

library(tidyr)
original_df %>% 
    gather(var_stats, value, -group_dummy_code) %>% 
    separate(var_stats, into = c("var", "stats")) %>% 
    spread(stats, value)

#  group_dummy_code  var mean    se
#1                0 var1  1.5 0.025
#2                0 var2  3.5 0.075
#3                1 var1  2.5 0.050
#4                1 var2  4.5 0.100