2015-10-02 95 views
0

我使用sm包中的函數binning獲取繪製的x,y座標,並將它們放入離散倉中。這將創建一個頻率表,其中bin的數量由SampleSize的用戶輸入確定。我的「頻率」表將錶轉換爲值列表

num_bins <- max(x_max,y_max)/SampleSize 
    bin_breaks <- matrix(c(bins,bins), num_bins+1,2) 
    frequency <- binning(combo_points,breaks=bin_breaks,nbins=num_bins)$table.freq 

輸出格式爲...

 x1 x2 x3 x4 x5... 
    y1 0 5 
    y2 0 
    y3 0 
    y4 
    y5 
    . 
    . 
    . 

但我需要將其轉換爲一個列表格式x和y的所有值...

x y count 
    1 1 0 
    1 2 0 
    1 3 0 
    2 1 5 
    . . . 
    . . . 

我想將此錶轉換爲x,y,count的data.frame列表,其中x和y現在實際上就是bin本身的x,y座標。我目前通過設置data.frame來列出bin座標(freq_points $ x和freq_points $ y),然後運行for循環來搜索表中與每行的值相匹配的數據我的freq_points data.frame創建一個新的vector(z)for循環的每個迭代都會附加到...但是有超過340萬個bin,這個過程需要幾個小時。

for (i in 1:length(frequency)){ 
    z<-append(z,frequency[freq_points$y[i],freq_points$x[i]])} 

有人可以推薦一個更優雅的解決方案嗎?有沒有更直接的方法將表格轉換爲列表?我在R中很新,也許我在這裏錯誤地使用了'table'和'list'這兩個術語。我希望上面給出的格式有助於澄清我的問題。從「dput(頻率)」 output from 'dput(frequency)'

輸出

應用答案下面我不具有X1,X2,Y1,Y2爲實際的行和列標題名稱的數據時,我遇到了一些麻煩。我正在用這些來試圖說明我的觀點,但似乎造成了更多的困惑。對此,我表示歉意。使用@neerajt提供的小矩陣......我不明白輸出結果,爲什麼count.1,count.2和count.3是給出的。這些「計數」列都不能用於x,y座標。你能否介紹一下這方面的情況?

freq <- matrix(c(0,0,1,5,0,1,1,0,1,1,1,0),nrow=4,ncol=3) 
    freq 
     [,1] [,2] [,3] 
    [1,] 0 0 1 
    [2,] 0 1 1 
    [3,] 1 1 1 
    [4,] 5 0 0 

    counts <- unlist(freq) 
    xname <- rep(c(1:ncol(freq)),nrow(freq)) 
    yname <- rep(c(1:nrow(freq)),ncol(freq)) 
    z <- data.frame(x=xname, y=yname, count=counts, row.names=NULL) 
    z 
     x y count.1 count.2 count.3 
    1 1 1  0  0  1 
    2 2 2  0  1  1 
    3 3 3  1  1  1 
    4 1 4  5  0  0 
    5 2 1  0  0  1 
    6 3 2  0  1  1 
    7 1 3  1  1  1 
    8 2 4  5  0  0 
    9 3 1  0  0  1 
    10 1 2  0  1  1 
    11 2 3  1  1  1 
    12 3 4  5  0  0 
+1

你可以'輸'頻率請 – Ananta

+1

你試過'as.data.frame(頻率)'? – MichaelChirico

+0

as.data.frame並未將表中數據的結構更改爲3列(x,y,z)數據框。 – braxtonlewis

回答

0

'binning'操作的輸出頻率表生成了一個不是data.frame的表,因此在將其應用爲asdata.frame(frequency)之前,使用unlist()函數將無法正常工作。

xname <- rep(1:ncol(frequency),times=1,each=nrow(frequency)) 
yname <- rep(1:nrow(frequency),times=ncol(frequency),each=1) 
z <- unlist(as.data.frame(frequency)) 
df <- data.frame(x=xname, y=yname, z=count) 

而且,請注意,所建議的,包括爲了創建正確的X中的「每個」功能需要@neerajt複製功能,y座標列表,使得它將對應方式「不公開()「將計數數據準備爲一個向量。使用unlist()提供了將計算時間小時轉換爲幾秒鐘的關鍵。謝謝大家的幫助。

0

下面是你可以嘗試的東西。如果你有一個freq表看起來像這樣:

freq = data.frame(x1=c(0,0,1,5), x2=c(0,1,1,0), x3=c(1,1,1,0)) 
row.names(freq) <- c("y1", "y2", "y3", "y4") 

x1 x2 x3 
y1 0 0 1 
y2 0 1 1 
y3 1 1 1 
y4 5 0 0 

然後

counts = unlist(freq) 

xname = rep(names(freq), nrow(freq)) 

yname = rep(row.names(freq), length(freq)) 

z = data.frame(x = xname, y = yname, count = counts, row.names=NULL) 

z將返回

x y count 
1 x1 y1  0 
2 x2 y2  0 
3 x3 y3  1 
4 x1 y4  5 
5 x2 y1  0 
6 x3 y2  1 
7 x1 y3  1 
8 x2 y4  0 
9 x3 y1  1 
10 x1 y2  1 
11 x2 y3  1 
12 x3 y4  0 

希望得到您關。主要內容是unlist()操作。

當涉及到的術語,都是表,或R.更具體data.frames不同的是你的原始表(frequency)是格式,你打算(z)的表格式。很好地說明了這個想法。