Цикл по столбцам фрейма данных для создания графиков с помощью ggplot2 - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь преодолеть это.Не могу получить дальше.

У меня есть фрейм данных с факторными и числовыми переменными.При этом отображаются первые несколько строк и столбцов.

# A tibble: 6 x 5
  cluster SEV_D SEV_M   OBS   PAN  
    <int> <dbl> <dbl> <fct> <fct>  
1       1     5     1    0     1    
2       2     6     1    0     0    
3       1     5     1    0     1    
4       2     4     2    0     0    
5       1     4     1    1     1    
6       1     4     2    1     0   

cluster=as.factor(c(1,2,1,2,1,1))  
SEV_D=as.numeric(c(5,6,5,4,4,4))
SEV_M=as.numeric(c(1,1,1,2,1,2))
OBS=as.factor(c(0,0,0,0,1,1))
PAN=as.factor(c(1,0,1,0,1,0))
data<-data.frame(cluster,SEV_D,SEV_M,OBS,PAN) 

Я разделяю фрейм данных таким образом, на числовые и факторные переменные, сохраняя «кластер» в обоих подмножествах, так как он мне нужен для группировки.

data_fact <- data[, sapply(data, class) == 'factor']

data_cont <- data[, sapply(data, class) == 'numeric' | names(data) 
== "cluster"]

Два следующих фрагмента кода дадут нужные мне графики.

data_fact %>% group_by(cluster,OBS)%>%summarise(total.count=n()) %>% 
ggplot(., aes(x=cluster, y=total.count, fill=OBS)) + 
geom_bar(position = 'dodge', stat='identity') + 
geom_text(aes(label=total.count),  
position=position_dodge(width=0.9), vjust=-0.2)

data_cont %>% group_by(cluster) %>% dplyr::summarise(mean = 
mean(SEV_D), sd = sd(SEV_D)) %>% 
ggplot(.,aes(x=cluster,y=mean))+geom_bar(position=position_dodge(), 
stat="identity",colour="black",size=.3)+geom_errorbar(aes(ymin=mean- 
sd, ymax=mean+sd),size=.3,width=.4,position=position_dodge(.4)) + 
ggtitle("SEV_D")

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

Моя попытка была

col<-names(data_fact)[!names(data_fact)%in%"cluster"]

for(i in col) {
data_fact %>% group_by(cluster,i)%>%summarise(total.count=n()) %>% 
ggplot(., aes(x=cluster, y=total.count, fill=i)) + geom_bar(position 
= 'dodge', stat='identity') + geom_text(aes(label=total.count), 
position=position_dodge(width=0.9), vjust=-0.2)
}

Но выдает эту ошибку:

Ошибка в grouped_df_impl (данные, unname (переменные), drop): столбецi неизвестно

Кроме того, этот код, я боюсь, не будет отображать все графики на одном листе.Любая помощь будет высоко ценится !!!

1 Ответ

0 голосов
/ 28 января 2019

Ссылка выше является хорошей ссылкой.Или см. Tidyeval Chatsheet Rstudio: https://github.com/rstudio/cheatsheets/raw/master/tidyeval.pdf

Чтобы оценить i в операторе ggplot, вам необходимо заключить строку в кавычку с помощью конструкции функции !!ensym( ).Также вам нужно будет использовать оператор print для печати графиков в цикле.

library(ggplot2)

col<-names(data_fact)[!names(data_fact)%in%"cluster"]

for(i in col) {
   print(i)

   g<-data_fact %>% group_by(cluster, !!ensym(i)) %>% summarise(total.count=n()) %>% 
     ggplot(., aes(x=cluster, y=total.count, fill=!!ensym(i))) + 
     geom_bar(position  = 'dodge', stat='identity') + 
     geom_text(aes(label=total.count), position = position_dodge(width=0.9), vjust=-0.2) +
     labs(title=i)
  print(g)
}
...