2017-02-14 5 views
-1
ハンス・ロスリングのインスピレーションから

https://www.ted.com/talks/hans_rosling_shows_the_best_stats_you_ve_ever_seen#t-103612ベクトルを2Dグリッド表示に変換:与えられた整数に最も近い(整数)領域の矩形を見つける方法は?

私は容易に理解し、面白いグラフ形式での統計情報を表現しようとしています。これを行うための一歩として、私はこの問題を解決したいと思います。 X=7場合interger Xを考えると

は、私がそのエリア(のL * W)と最も密接たとえばX/

に一致する長方形Rを見つけたい、そしてRl=2 & w=4(面積= 8)を持つべきです。

len1 <- 7 

m1 <- ceiling(sqrt(len1)) 
m1 


m2 <- ceiling(len1 /m1) 
m2 

をしかし、最善の解決策は、2 * 4であるのに対し、これは3 * 3を与える:

は、私が試してみました。

+2

どの矩形を使用できるのかを規定する規則は何ですか? 1×7の長方形が適しています。 – G5W

+0

一番小さいスペースで塗り潰した正方形に最も近い –

答えて

2

これはあなたの例のために働くと、テスト機能今

dimGet <- function(x) { 
    dim1 <- floor(sqrt(x)) 
    dim2 <- (x %/% dim1 + (x %% dim1 != 0)) 

    return(c(dim1=dim1, dim2=dim2)) 
} 

にこれを入れ、10

を通じて1に対してそれを実行するには、一般的な

# get the first dimension 
dim1 <- floor(sqrt(len1)) 
# fill out the second dimension 
dim2 <- (len1 %/% dim1 + (len1 %% dim1 != 0)) 

に働くかもしれません

sapply(1:10, dimGet) 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
dim1 1 1 1 2 2 2 2 2 3  3 
dim2 1 2 3 2 3 3 4 4 3  4 
+0

おかげさまで、ありがとうございました。 –

1

私ははっきりしていません。あなたが望む帽子ですが、これはうまくいくかもしれません。

getrect = function(x = 7){ 
    f = floor(sqrt(x)) 
    if(f^2 == x){ 
     return(c(f,f)) 
    } 
    d = max(2,(f - 500)):(f + 500) #decrease 500 to improve speed, increase 500 to improve accuracy 
    d = data.frame(t(combn(d,2))) 
    d$M = d$X1 * d$X2 
    d = d[d$M >= x,] 
    d$diff = abs(d$X1-d$X2) 
    d$M_diff = abs(d$M-x) 
    d = d[with(d, order(M_diff, diff)), ] 
    return(c(d[1,1], d[1,2])) 
} 

sapply(1:25, getrect) 
#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25] 
#[1,] 1 2 2 2 2 2 2 2 3 2  3  3  3  3  3  4  3  3  4  4  3  4  4  4  5  
#[2,] 1 3 3 2 3 3 4 4 3 5  4  4  5  5  5  4  6  6  5  5  7  6  6  6  5  
関連する問題