2016-01-04 4 views
4

Как создать простые статистические данные, используя dplyr из нескольких переменных? Однако, используя функцию summarise_each, при применении нескольких функций к нескольким столбцам результат представляет собой широкий, трудно читаемый фрейм данных.dplyr - сводная таблица для нескольких переменных

ответ

14

Используйте dplyr в сочетании с tidyr, чтобы изменить конечный результат.

library(dplyr) 
library(tidyr) 

df <- tbl_df(mtcars) 

df.sum <- df %>% 
    select(mpg, cyl, vs, am, gear, carb) %>% # select variables to summarise 
    summarise_each(funs(min = min, 
         q25 = quantile(., 0.25), 
         median = median, 
         q75 = quantile(., 0.75), 
         max = max, 
         mean = mean, 
         sd = sd)) 

# the result is a wide data frame 
> dim(df.sum) 
[1] 1 42 

# reshape it using tidyr functions 

df.stats.tidy <- df.sum %>% gather(stat, val) %>% 
    separate(stat, into = c("var", "stat"), sep = "_") %>% 
    spread(stat, val) %>% 
    select(var, min, q25, median, q75, max, mean, sd) # reorder columns 

> print(df.stats.tidy) 

    var min q25 median q75 max  mean  sd 
1 am 0.0 0.000 0.0 1.0 1.0 0.40625 0.4989909 
2 carb 1.0 2.000 2.0 4.0 8.0 2.81250 1.6152000 
3 cyl 4.0 4.000 6.0 8.0 8.0 6.18750 1.7859216 
4 gear 3.0 3.000 4.0 4.0 5.0 3.68750 0.7378041 
5 mpg 10.4 15.425 19.2 22.8 33.9 20.09062 6.0269481 
6 vs 0.0 0.000 0.0 1.0 1.0 0.43750 0.5040161 
+0

Я предпочитаю это решение за Stargazer, потому что она возвращает data.frame, что я могу затем используйте далее. Но, к сожалению, я сталкиваюсь с проблемами, потому что у моих имен переменных есть подчеркивания в них, которые вызывают отдельный шаг на пипе. Я смотрел, чтобы увидеть, есть ли у параметра параметр, чтобы использовать самый правый символ подчеркивания, но ему не повезло. Любые советы о том, как обобщить это, чтобы он не задушил переменные с подчеркиванием? – Magnus

1

Вы можете достичь того же результата, используя data.table, а также. Вы можете использовать его, если ваш стол большой.

dt <- data.table(mtcars) 

cols <- c('mpg', 'cyl', 'vs', 'am', 'gear', 'carb') 
functions <- c('min', 'q25', 'median', 'q75', 'max', 'mean', 'sd') 

dt.sum <- dt[ 
    , 
    lapply(
     .SD, 
     function(x) list(
       min(x), quantile(x, 0.25), median(x), 
       quantile(x, 0.75), max(x), mean(x), sd(x) 
     ) 
    ), 
    .SDcols = cols 
] 

dt.sum 
    mpg cyl  vs  am gear carb 
1: 10.4  4  0  0  3  1 
2: 15.43  4  0  0  3  2 
3: 19.2  6  0  0  4  2 
4: 22.8  8  1  1  4  4 
5: 33.9  8  1  1  5  8 
6: 20.09 6.188 0.4375 0.4062 3.688 2.812 
7: 6.027 1.786 0.504 0.499 0.7378 1.615 

# transpose and provide meaningful names 
dt.sum.t <- as.data.table(t(sum))[] 
setnames(dt.sum.t, names(dt.sum.t), functions) 
dt.sum.t[, var := cols] 
setcolorder(dt.sum.t, c("var", functions)) 

dt.sum.t 
    var min q25 median q75 max mean  sd 
1: mpg 10.4 15.43 19.2 22.8 33.9 20.09 6.027 
2: cyl 4  4  6 8 8 6.188 1.786 
3: vs 0  0  0 1 1 0.4375 0.504 
4: am 0  0  0 1 1 0.4062 0.499 
5: gear 3  3  4 4 5 3.688 0.7378 
6: carb 1  2  2 4 8 2.812 1.615 
3

Если вы хотите создать сводную таблицу для публикации (не для дальнейших расчетов) вы можете посмотреть на отличную stargazer пакет.

df <- data.frame(mtcars) 
cols <- c('mpg', 'cyl', 'vs', 'am', 'gear', 'carb') 
stargazer(
    df[, cols], type = "text", 
    summary.stat = c("min", "p25", "median", "p75", "max", "median", "sd") 
) 

================================================================ 
Statistic Min Pctl(25) Median Pctl(75) Max Median St. Dev. 
---------------------------------------------------------------- 
mpg  10.400 15.430 19.200 22.800 33.900 19.200 6.027 
cyl   4  4  6  8  8  6  1.786 
vs   0  0  0  1  1  0  0.504 
am   0  0  0  1  1  0  0.499 
gear  3  3  4  4  5  4  0.738 
carb  1  2  2  4  8  2  1.615 
---------------------------------------------------------------- 

Вы можете изменить тип на «латекс» и «HTML», а также и сохранить его в файл с указанием файла дающей «из» аргумента.

3

Мне понравилась идея paljenczy просто использовать dplyr/tidy и получить таблицу в файле data.frame/tibble перед ее форматированием. Но я столкнулся с проблемами надежности: поскольку он основан на разборе имен переменных, он задыхается от столбцов с символами подчеркивания в именах. Попытавшись исправить это в рамках dplyr, казалось, что он всегда будет несколько хрупким, потому что он полагался на синтаксический анализ строк.

Итак, в конце концов я решил использовать psych :: описание(), которая является функцией, предназначенной именно для этой цели. Он не выполняет абсолютно произвольные функции, но почти все, что реально хотелось бы сделать. Полный пример дублирования предыдущих решений ниже (объединения описывают с некоторой tidyverse вещи, чтобы получить точный Тиббл я ищу):

library(psych) 
library(tidyverse) 

# Create an extended version with a bunch of stats 
d.summary.extended <- mtcars %>% 
    select(mpg, cyl, vs, am, gear, carb) %>% 
    psych::describe(quant=c(.25,.75)) %>% 
    as_tibble() %>% 
    rownames_to_column() %>% 
    print() 

<OUTPUT> 
# A tibble: 6 x 16 
    rowname vars  n  mean  sd median trimmed  mad min max range  skew kurtosis   se Q0.25 Q0.75 
    <chr> <int> <dbl> <dbl>  <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl>  <dbl> <dbl> <dbl> 
1  mpg  1 32 20.09062 6.0269481 19.2 19.6961538 5.41149 10.4 33.9 23.5 0.6106550 -0.372766 1.06542396 15.425 22.8 
2  cyl  2 32 6.18750 1.7859216 6.0 6.2307692 2.96520 4.0 8.0 4.0 -0.1746119 -1.762120 0.31570933 4.000 8.0 
3  vs  3 32 0.43750 0.5040161 0.0 0.4230769 0.00000 0.0 1.0 1.0 0.2402577 -2.001938 0.08909831 0.000 1.0 
4  am  4 32 0.40625 0.4989909 0.0 0.3846154 0.00000 0.0 1.0 1.0 0.3640159 -1.924741 0.08820997 0.000 1.0 
5 gear  5 32 3.68750 0.7378041 4.0 3.6153846 1.48260 3.0 5.0 2.0 0.5288545 -1.069751 0.13042656 3.000 4.0 
6 carb  6 32 2.81250 1.6152000 2.0 2.6538462 1.48260 1.0 8.0 7.0 1.0508738 1.257043 0.28552971 2.000 4.0 
</OUTPUT> 

# Select stats for comparison with other solutions 
d.summary <- d.summary.extended %>% 
    select(var=rowname, min, q25=Q0.25, median, q75=Q0.75, max, mean, sd) %>% 
    print() 

<OUTPUT> 
# A tibble: 6 x 8 
    var min q25 median q75 max  mean  sd 
    <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl> 
1 mpg 10.4 15.425 19.2 22.8 33.9 20.09062 6.0269481 
2 cyl 4.0 4.000 6.0 8.0 8.0 6.18750 1.7859216 
3 vs 0.0 0.000 0.0 1.0 1.0 0.43750 0.5040161 
4 am 0.0 0.000 0.0 1.0 1.0 0.40625 0.4989909 
5 gear 3.0 3.000 4.0 4.0 5.0 3.68750 0.7378041 
6 carb 1.0 2.000 2.0 4.0 8.0 2.81250 1.6152000  
</OUTPUT> 
Смежные вопросы