2014-01-09 28 views
1

由於R是新手,我有一個關於寫入和讀取矢量數據的問題。R在文件IO上產生不同的結果

我的實施例1

 
n = 100 
g = 6 
set.seed(g) 
d <- data.frame(x = unlist(lapply(1:g, function(i) rnorm(n/g, runif(1)*i^2))), 
       y = unlist(lapply(1:g, function(i) rnorm(n/g, runif(1)*i^2)))) 
plot(d) 
require(vegan) 
fit <- cascadeKM(scale(d, center = TRUE, scale = TRUE), 1, 10, iter = 1000) 
plot(fit, sortg = TRUE, grpmts.plot = TRUE) 
calinski.best <- as.numeric(which.max(fit$results[2,])) 
cat("Calinski criterion optimal number of clusters:", calinski.best, "\n") 

source),它打印 「簇Calinski標準最佳數目:5」 如預期。

實施例2:(寫入數據幀d第一,然後將其讀)

 
n = 100 
g = 6 
set.seed(g) 
d <- data.frame(x = unlist(lapply(1:g, function(i) rnorm(n/g, runif(1)*i^2))), 
       y = unlist(lapply(1:g, function(i) rnorm(n/g, runif(1)*i^2)))) 

write.table(d, "d.txt", sep='\t', quote=FALSE) #write data frame 
d = read.table("d.txt", header=TRUE, sep = '\t') #read later 
plot(d) 

require(vegan) 
fit <- cascadeKM(scale(d, center = TRUE, scale = TRUE), 1, 10, iter = 1000) 
plot(fit, sortg = TRUE, grpmts.plot = TRUE) 
calinski.best <- as.numeric(which.max(fit$results[2,])) 
cat("Calinski criterion optimal number of clusters:", calinski.best, "\n") 

然而,實施例2頁的打印 「簇Calinski標準最佳數量:1」。

我認爲格式(或別的東西)已經在R從文件中的IO後改變了。但是我不知道R如何讀寫數字。任何人都可以給我一些線索,謝謝。

編輯 如果文件寫入時沒有列名和行名,問題就解決了。

 
write.table(d, "d.txt", sep='\t', quote=FALSE, row.name=FALSE, col.names=FALSE) 

讀取時,R還讀取行和列名。 另一個是在閱讀時逃避這些名字。

+0

情節在兩種情況下都是一樣的嗎?代碼看起來完全一樣... 你再次閱讀後再打印,以便比較它是否相同(也許只是它的'head'會做'head(d)') – Llopis

+0

這個圖是一樣的,打印表框d的相同。 – user200340

+1

將數字寫入文本文件很可能會失去一些精度。改用'save'或'saveRDS'。 –

回答

0

不能爲一個組計算Calinski索引,但它變成Inf或-Inf。在第一個例子中,它碰巧是-Inf,而第二個例子恰好是Inf,當你尋找which.max時,Inf就是你得到的。我不知道爲什麼我們真的很想計算一類案例的指數,但是如果您搜索最佳結果,則應該忽略第一種情況。我們在plot命令中這樣做,該命令在這兩種情況下給出了五個集羣作爲最佳結果。你的代碼下面的修改將給出相同的答案在這兩種情況下:

calinski.best <- as.numeric(which.max(fit$results[2,-1])) + 1 
cat("Calinski criterion optimal number of clusters:", calinski.best, "\n") 

我們不得不+1因爲我們省略了一個列。

Inf/-Inf不確定性的小細節。正如你在?cascadeKM中看到的那樣,Calinski準則被定義爲(SSB /(K-1))/(SSW /(n-K))並且對於一個組K = 1,使得SSB/0 = Inf。對於一個組也是SSB = 0,但計算結果爲零,並且這些在數字計算機中很少精確,並且在我的計算機零中是-2.8e-14和-2.8e-14/0 = -Inf。在第二個例子中,SSB = 2.8e-14和2.8e-14/0 = Inf。當你尋找最佳的時候,忽略第一列。偶爾SSB可以精確爲零,然後0/0 = NaN(不是數字)。

相關問題