2016-12-13 3 views
0

Я пытаюсь воспроизвести следующую первенствовать сводную таблицу в г: Excel pivot tableВОПРОИЗВЕДЕНИЯ вложенного Excel Сводной таблицы в г с табличной

Используя табличный:

library(vcd) 
library(tables) 
tabular(Sex*(Treatment+1)+1~(count=ID + Percent("col")), data=Arthritis) 

производит:

   count   
Sex Treatment ID Percent 
Female Placebo 32  38.10 
     Treated 27  32.14 
     All  59  70.24 
Male Placebo 11  13.10 
     Treated 14  16.67 
     All  25  29.76 
     All  84 100.00 

Есть ли способ получить проценты лечения до 100 для каждого пола, как таблица превосходных опорных точек?

ответ

0

Все, кроме финальной серии All, может быть выполнено следующим образом.

library(dplyr) 
library(tidyr) 

    df <- Arthritis %>% 
    group_by(Sex, Treatment) %>% 
    summarise(cnt = n()) %>% 
    ungroup() %>% 
    spread(Treatment, cnt) %>% 
    mutate(All = Placebo + Treated) %>% 
    gather(Treatment, ID , -Sex) %>% 
    group_by(Sex) %>% 
    mutate(percent = ID/(sum(ID)/2)) %>% 
    arrange(Sex, desc(Treatment)) #forces "Treated" to top of Treatment column for each group 

    > df 
Source: local data frame [6 x 4] 
Groups: Sex [2] 

    Sex Treatment ID percent 
    <fctr>  <chr> <int>  <dbl> 
1 Female Treated 27 0.4576271 
2 Female Placebo 32 0.5423729 
3 Female  All 59 1.0000000 
4 Male Treated 14 0.5600000 
5 Male Placebo 11 0.4400000 
6 Male  All 25 1.0000000 

Если вам нужна общая линия, вы можете использовать следующее, но это не очень красиво.

grand_total <- data.frame(Sex = "Total" , "Treatment" = "All", 
          ID = nrow(Arthritis), percent = 1, 
          stringsAsFactors = FALSE) 

df_final <- bind_rows(df, grand_total) 

Теперь, если вы хотите, чтобы вымарать в Sex колонке для первого, за исключением появления, вы можете сделать это таким образом. Поскольку мы сортировали по порядку деления в столбце Treatment, мы знаем, что это Treated как верх каждой группы. Поэтому мы просто заменяем столбец Sex пробелом, когда столбец Treatment не равен Treated. Мы также не затушевываем созданный нами All.

df_final$Sex[df_final$Treatment != "Treated" & 
df_final$Sex %in% c("Female", "Male")] <- "" 

Source: local data frame [7 x 4] 
Groups: Sex [3] 

    Sex Treatment ID percent 
    <chr>  <chr> <int>  <dbl> 
1 Female Treated 27 0.4576271 
2   Placebo 32 0.5423729 
3    All 59 1.0000000 
4 Male Treated 14 0.5600000 
5   Placebo 11 0.4400000 
6    All 25 1.0000000 
7 Total  All 84 1.0000000 
+0

Если вы хотите удалить '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '', вы можете сделать это с помощью простого фильтра '%>% (Treatment! =" All "' в конце создания из объекта 'df'. Не уверен, что это цель или нет. –

+0

Спасибо, Ник. Есть ли способ удалить дублирование женщин и мужчин после появления первой строки? Цель состоит в том, чтобы воспроизвести внешний вид вывод таблицы сводных таблиц Excel. – user2547973

+0

Я обновил код, чтобы исключить строку 'Sex', за исключением первого экземпляра. –

 Смежные вопросы

  • Нет связанных вопросов^_^