2014-09-19 4 views
1

내가 (CSV에서 수입) 테이블에있는 데이터의 무리가를 사용하여 누적 막대 그래프에 대한 데이터를 바꿀 방법 :는 다음과 같은 형식으로 R 격자

date  classes   score 
9/1/11  french   34 
9/1/11  english   34 
9/1/11  french   34 
9/1/11  spanish   34 
9/2/11  french   34 
9/2/11  english   34 
9/3/11  spanish   34 
9/3/11  spanish   34 
9/5/11  spanish   34 
9/5/11  english   34 
9/5/11  french   34 
9/5/11  english   34 

이 점수 열을 무시, 그것은 중요하지 않습니다.

날짜를 기준으로 영어 또는 스페인어 또는 프랑스어 수업을받는 학생의 총 수를 집계해야합니다. 먼저 날짜별로 그룹화 한 다음 언어를 기반으로 각 블록을 더 많은 블록으로 나누고 스택 막대 차트로 그려야하므로 다음과 같이 보입니다. 각 막대는 날짜를 나타내고 막대의 각 단면은 단일 언어를 나타냅니다.

각 행이 날짜와 모든 열을 특성 (또는 언어)으로 나타내는 행렬 형식으로 데이터를 얻은 후에이를 수행하는 방법을 알아 냈습니다. 그래서 나는 CSV에서 그 형태의 데이터를 가정 할 :

ie   french  english  spanish 
9/1/11  2   1    1 
9/2/11  1   1    0   
9/3/11  0   0    2 
9/5/11  1   2    1 

다음 내가 할 수있는 :

directory<-"C:\\test\\language.csv" 
ourdata6<-read.csv(directory) 

language<-as.matrix(ourdata6) 

barchart(prop.table(language), horizontal=FALSE, auto.key = list(space='right',cex=.5,border=T,points=F, lines=F,lwd=5,text=c('french','spanish','enligsh'),cex=.6), main = list(label="Distribution of classes 10",cex=2.5), ylab = list(", cex=1.7),xlab.top=list("testing",cex=1.2)) 

도전은 내가 필요로하는 형식으로 원래 형식에서 데이터를 얻을 수 있습니다. 이 모두 나에게 정렬 된 수를 제공하지만 수직 형태

ie 
9/1/11  french   2    
9/1/11  english   1      
9/1/11  spanish   1    
etc... 

에 나는이 그래서 날짜 당 하나의 행이된다 피벗 필요로하는 곳에

나는

a<-count(language, c("date", "classes")) 

을 시도했다. 또한 이들 중 일부가 0 일 수 있으므로 그 자리 표시자를 필요로합니다. 첫 번째 열은 french에 해당해야하고, 두 번째 열은 현재 설정이 작동하려면 영어와 일치해야합니다.

이 작업을 수행하는 방법에 대한 아이디어가 있거나 matrix + prop.table을 사용하는 방식이 맞다면 어떻게해야할까요? 이 작업을 수행하는 간단한 방법이 있습니까? 이 다음 dataframe 결과, 사용자가 제공 한 예제 데이터를 사용하여

library(dplyr) 
library(tidyr) 

wide <- df %>% select(date,classes) %>% 
    group_by(date,classes) %>% 
    summarise(n=n()) %>%   # as @akrun said, you can also use tally() 
    spread(classes, n, fill=0) 

:

답변

4

가정하면 데이터는 당신이 dplyrtidyr 패키지의 도움으로 그렇게 할 수 df라는 dataframe에

barchart(date ~ english + french + spanish, data=wide, stack = TRUE, 
     main = list(label="Distribution of language classes",cex=1.6), 
     xlab = list("Number of classes", cex=1.1), 
     ylab = list("Date", cex=1.1), 
     auto.key = list(space='right',cex=1.2,text=c('Enligsh','French','Spanish'))) 
:
date english french spanish 
9/1/11  1  2  1 
9/2/11  1  1  0 
9/3/11  0  0  2 
9/5/11  2  1  1 

이제와 lattice 플롯을 만들 수 있습니다 다음 플롯을 제공

: enter image description here


편집 : 대신 격자 플롯을 사용하는, 당신은 또한 이해하기 쉽게 ggplot2을, (적어도 내 의견)을 사용할 수 있습니다.예 : 나는 아무것도없는 아니에요 희망 enter image description here

+1

+1, 또는'DF %> '% tally() %> (클래스, n, 채우기 = 0)' – akrun

+1

@akrun'tally' 함수를 가리키는 Thanx. 오늘 새로운 무언가를 다시 배웠습니다 :-) – Jaap

+0

안녕하세요, 감사합니다, 그 명령의 테이블 이름은 어디입니까 – curfewed

4

,하지만 당신은 단지 table 찾고있는 것처럼 나에게 같습니다 :

# convert the wide dataframe to a long one 
long <- wide %>% gather(class, n, -date) 

# load ggplot2 
library(ggplot2) 

# create the plot 
ggplot(long, aes(date, n, fill=class)) + 
    geom_bar(stat="identity", position="stack") + 
    coord_flip() + 
    theme_bw() + 
    theme(axis.title=element_blank(), axis.text=element_text(size=12)) 

주는

table(df[c("date", "classes")]) 
#   classes 
# date  english french spanish 
# 9/1/11  1  2  1 
# 9/2/11  1  1  0 
# 9/3/11  0  0  2 
# 9/5/11  2  1  1 

을 결과는 table (이는 matrix이기도 함)이므로 원하는대로 barchart 명령을 사용할 수 있습니다. 여기

내가 무엇을 얻을 - 당신이 사용

enter image description here

코드 :-) 범례에서 작업 한 필요가 다음과 같습니다

language <- table(df[c("date", "classes")]) 

barchart(prop.table(language), 
     horizontal = FALSE, 
     auto.key = list(space = 'right', 
         cex = .5, border = T, points = F, 
         lines = F, lwd = 5, 
         text = c('french','spanish','enligsh'), 
         cex = .6), 
     main = list(label = "Distribution of classes 10", cex = 2.5), 
     ylab = list("", cex = 1.7), 
     xlab.top = list("testing", cex = 1.2)) 
+0

감사하지만이 문제는 단지 월말까지만 순서가 있으므로 첫 번째 행은 9/1/11, 두 번째 행은 9/1/2012, 세 번째 행은 9/1/2013 등 – curfewed

+1

@curfewed, 음, 문자열 대신 실제 날짜를 사용하거나 문자열을 사용하는 경우 주문한 요소로 사용하면 도움이됩니다. 그것들은 당신의 질문과 관련이 없습니다. 이것은 격자 사용을 위해 당신의 데이터를 재 형성하는 방법이었습니다. – A5C1D2H2I1M1N2O1R2T1