Все, кроме финальной серии 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
Если вы хотите удалить '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '', вы можете сделать это с помощью простого фильтра '%>% (Treatment! =" All "' в конце создания из объекта 'df'. Не уверен, что это цель или нет. –
Спасибо, Ник. Есть ли способ удалить дублирование женщин и мужчин после появления первой строки? Цель состоит в том, чтобы воспроизвести внешний вид вывод таблицы сводных таблиц Excel. – user2547973
Я обновил код, чтобы исключить строку 'Sex', за исключением первого экземпляра. –