2012-02-03 4 views
9

나는 같은 형식이 데이터 프레임을 다음R에서 집계 된 데이터로 어떻게 히스토그램을 만들 수 있습니까?

Month  Frequency 
2007-08  2 
2010-11  5 
2011-01  43 
2011-02  52 
2011-03  31 
2011-04  64 
2011-05  73 

나는 X 아마 약 15이 될 것이다 (X 쓰레기통을 사용하여이 데이터에서 히스토그램을 생성하고 싶지만, 실제 데이터가있다 200 개월 이상), 빈도 열의 데이터를 히스토그램의 각 빈에 대한 빈도로 사용합니다. 이것을 어떻게 할 수 있습니까?

hist() 및 barplot() 명령을 사용하여 지금까지 두 가지 방법을 시도했습니다. hist() 문제는 히스토그램의 빈도 계산에서 빈도 열을 사용하도록 지정하는 방법을 제공하지 않는 것 같습니다. barplot()의 문제점은 X bin을 선택하는 데 유연성이 없다는 것입니다. 생략 된 달이있는 경우 결과 그래프는 실제로 x 축이 연속이 아니기 때문에 실제로는 히스토그램이 아닙니다.

barplot() 접근법을 사용하여 빈도를 0으로 채우고 빈 사이에 간격을 제거하려면 공백 = 0을 사용하는 것이 유일한 아이디어입니다. 문제는 임의의 개수의 저장소를 선택하는 것이 특히 쉽지 않다는 것입니다.

답변

4

유연성 이런 종류의를 얻으려면, 당신은 당신의 데이터를 복제 할 수 있습니다.

par(mfcol=c(1, 2)) 
hist(expdat$x, breaks=50, col="blue", main="50 bins") 
hist(expdat$x, breaks=5, col="blue", main="5 bins") 
par(mfcol=c(1, 1)) 

enter image description here

:

n <- 10 
dat <- data.frame(
    x = sort(sample(1:50, n)), 
    f = sample(1:100, n)) 
dat 

expdat <- dat[rep(1:n, times=dat$f), "x", drop=FALSE] 

지금 당신은 당신의 데이터는 쓰레기통의 다른 번호로 hist 전화를 허용하는 data.frame expdat 복제 한 : 여기 rep으로 그 일을하는 한 가지 방법은

+1

나는 질문을 던졌을 때, 내가 단순하게 제시 한 것보다 내 주파수가 실제로 1 백만에서 5 천만 달러에 이른다는 것을 간과했기 때문에 나는 그것을 너무 많이 단순화했다. 이 주파수는 너무 높아서 내 컴퓨터의 원시 데이터 (8GB RAM)에 'rep'를 사용할 수 없습니다. 나는이 주파수들을 나의 목적을위한 충분한 히스토그램 (즉, 확률 분포)을 준 작은 스케일 (1 ~ 100,000)로 변환했다. 나는 일반적으로 당신의 대답을 좋아합니다. 그리고 지금까지 제가 "진정한"히스토그램을주는 유일한 해결책입니다. 감사! –

+0

주파수가 너무 높으면 expdat <- dat [rep (1 : n, times = dat $ f/1000), "x", drop = FALSE] 주파수 계수를 간단히 축소 할 수 있습니다. – Marian

4

ggplot2에서 방황하십시오.

하면 데이터가 df라는 data.frame에있는 경우 :

ggplot(df,aes(x=Month,y=Frequency))+geom_bar(stat='identity') 

또는 연속적인 시간을 원하는 경우 :

df$Month<-as.POSIXct(paste(df$Month, '01', sep='-'),format='%Y-%m-%d') 
ggplot(df,aes(x=Month,y=Frequency))+geom_bar(stat='identity') 
+0

두 번째 예제를 실행하면 ggplot 명령을 실행할 때'Error : 비 연속 변수가 scale_y_continuous로 제공되었습니다. '라는 메시지가 나타납니다. 어떤 아이디어? –

+0

귀하의 데이터에 대해 더 알고 싶습니다. 귀하의 'Frequency'가 숫자가 아닌 것으로 가정합니다. 데이터를 다시 만들면 :'df <-data.frame (Month = c ('2007-08', '2010-11', '2011-01', '2011-02', '2011-03', '2011 -04 ','2011-05 '), 빈도 = c (2,5,43,52,31,64,73))'입니다. 이 두 명령을 사용하면 문제가 없습니다. 데이터의 'str'을 확인하고 y에 대한 연속 변수를 제공하는지 확인하십시오. – Justin

+0

월 열을 날짜 유형으로 변환하여 두 번째 예제 작업을 얻었습니다. 이것은 내가 원하는 것에 더 가깝지만, 이상적으로, 나는 더 적은 쓰레기통을 가질 것입니다. 이것은 모든 개별 날짜에 대한 막대 (효과적으로 빈)를주는 것 같습니다._Edit_ : 방금 위의 귀하의 의견을 보았습니다; 그 문제를 해결하기 위해 제 질문을 업데이트하겠습니다. –

3

예, rep 솔루션은 가장 흥미롭고 큰 경우에 너무 많은 메모리를 낭비합니다. HistogramTools CRAN 패키지에는 기본 질문과 같이 빈 및 나누기 목록에서 직접 기본 R 히스토그램 개체를 만드는 효율적인 PreBinnedHistogram 함수가 포함되어 있습니다.

+0

감사합니다. 이것은 정말로 유용했습니다. 유일한 실망은 함수가'breaks','counts' 및'xnames'라는 인수를 취하므로 아마도 다른 설정을 둘러싼 모든 동작을 나중에 수행해야한다는 것입니다. 히스토그램이 처음 생성 될 때'axes = FALSE'를 설정하는 것보다는'plot (myhist, axes = FALSE) '을 사용하십시오. 누구든지 출력이 어떻게 보이는지 알고 싶다면이 방법으로 생성 된 막대 그래프를이 답변에 포함 시키십시오. http://stats.stackexchange.com/a/122853/22228 – Silverfish

0

또 다른 가능성은 담당자가 할 일이별로 없도록 몇 가지 큰 요인에 의해 빈도 변수의 크기를 줄이는 것입니다. 그런 다음 동일한 요소로 막대 그래프의 세로 축척 비율을 조정하십시오.

관련 문제