Таблица по группам с использованием dplyr - PullRequest
0 голосов
/ 09 октября 2018

Вот мой реплицирующий пример.

HAVE <- data.frame(ID=c(1,2,3,4,5,6),
                   CLASS=c("A","A","B","B","C","C"),
                   AGE=c(14,13,11,12,14,14),
                   GENDER=c('MALE','MALE','FEMALE','MALE','FEMALE','FEMALE'))


WANT <- data.frame(COLUMN=c('AGE','GENDER = MALE'),
                   CLASSA=c(13.5,100),
                   CLASSB=c(11.5,50),
                   CLASSC=c(14,0))

По сути, цель состоит в том, чтобы создать новый фрейм данных, который показывает средние значения для числовых переменных и проценты для факторных переменных.

This is my coding attempt
HAVE %>%
  count(HAVE[,]) %>%
  group_by(CLASS) %>%
  mutate(mean)

Ответы [ 4 ]

0 голосов
/ 09 октября 2018

Попытка на базе R решения

list.out <- 
  lapply(HAVE[-(1:2)], function(x){
        if(is.factor(x)) x <- x == levels(x)[2]
        aggregate(x, list(HAVE$CLASS), mean)$x})

out <- do.call(rbind, list.out)
colnames(out) <- unique(HAVE$CLASS)

out
#           A    B  C
# AGE    13.5 11.5 14
# GENDER  1.0  0.5  0
0 голосов
/ 09 октября 2018

Нечто подобное

HAVE %>% 
    select(GENDER, AGE, CLASS) %>% 
    group_by(CLASS) %>% 
    summarise(AGE = mean(AGE), GENDER_MALE = sum(ifelse(GENDER == "MALE", 1, 0))*100/n()) %>% 
    t()

Вывод

            [,1]   [,2]   [,3]  
CLASS       "A"    "B"    "C"   
AGE         "13.5" "11.5" "14.0"
GENDER_MALE "100"  " 50"  "  0" 
0 голосов
/ 09 октября 2018

Это должно работать.

HAVE %>% 
  group_by(CLASS) %>% 
  summarise(mean_age = mean(AGE), percent_male = mean(GENDER == "MALE")*100) %>% 
  t()

И вы получите:

             [,1]   [,2]   [,3]  
CLASS        "A"    "B"    "C"   
mean_age     "13.5" "11.5" "14.0"
percent_male "100"  " 50"  "  0" 

Похоже, пингвин победил меня, но я тоже опубликую, потому что в коде есть некоторые мелочи, которые, возможно,более упорядоченный - очень незначительный.

И если вы хотите, чтобы все числовые переменные имели среднее значение, а все факторы были в процентах, я думаю, вы можете nest(), map() и unnest().Может быть, кто-то может предоставить код для этого.

0 голосов
/ 09 октября 2018

С пакетом 'таблиц' вы можете получить:

library(tables)
tabular(AGE*mean+GENDER*Percent("col") ~ CLASS,HAVE)
#                       CLASS         
#                       A     B    C  
#        AGE    mean     13.5 11.5  14
# GENDER FEMALE Percent   0.0 50.0 100
#        MALE   Percent 100.0 50.0   0

И вы можете подмножество только MALE:

tabular(AGE*mean+GENDER*Percent("col") ~ CLASS,HAVE) [-2,]

#               CLASS        
#               A     B    C 
#  AGE  mean     13.5 11.5 14
#  MALE Percent 100.0 50.0  0
...