2017-04-10 193 views
0

當使用circlize軟件包中的chordDiagram()函數時,我需要一些幫助來解決返回的錯誤消息。錯誤'選擇了未定義的列' - R中的和絃圖(circlize包)

我正在與漁業登陸。漁船在一個港口(主港口PORT_DE)開始他們的旅程,並將他們的捕獲物(在這種情況下爲扇貝)落在另一個港口(登陸港口PORT_LA)。我正在嘗試使用circlize程序包繪製一個和絃圖來顯示端口之間的着陸流量。我有161個獨特的端口,端口名稱被存儲爲character字符串。

在調用chordDiagram()函數繪製和絃圖之前,我將相關列存儲在一個虛擬對象(m)中。

# Store relevant column 
m <- data.frame(PORT_DE = VMS_by_trips$PORT_DE_Label, 
      PORT_LA = VMS_by_trips$PORT_LA_Label, 
      SCALLOP_W = VMS_by_trips$Trip_SCALLOP_W) 

head(m) 
# PORT_DE PORT_LA SCALLOP_W 
# 1 Arbroath Arbroath 2.147143 
# 2 Eyemouth Aberdeen 8.791970 
# 3 Buckie Aberdeen 2.025833 
# 4 Montrose Aberdeen 8.268540 
# 5 Aberdeen Aberdeen 1.358286 
# 6 Peterhead Aberdeen 0.797500 

然後我使用dcast()創建一個鄰接矩陣並重命名行。

require(reshape2) 
m <- as.matrix(dcast(m, PORT_DE ~ PORT_LA, value.var = "SCALLOP_W", fun.aggregate = sum)) 
dim(m) #adjecency matrix represents port pairs 
#[1] 153 138 

row.names(m) <- m[,1] 
m <- m[,2:dim(m)[2]] 
class(m) <- "numeric" 

最後,我打電話給劇情功能chordDiagram()

library(circlize) 
chordDiagram(m) 

不幸的是,這會產生一條錯誤消息。

Error in `[.data.frame`(df, c(1, 2, 5)) : undefined columns selected 

如果我用數字替換行名和列名,函數將運行,並返回正確的圖。

row.names(m) <- 1:153 
colnames(m) <- 1:137 

任何想法如何運行實際的端口名稱的函數?

我已經嘗試刪除特殊字符,用"_"下劃線替換" "空格,保留較少數量的字符,只保留少數端口對。不幸的是,同樣的錯誤不斷出現。任何幫助讚賞。

請注意,自發布此問題以來,我設法創建了需要的 可視化。這是一個鏈接到另一個相關的問題, 其中還包括代碼來調整和絃 圖的各種設置。

Adjust highlight.sector() width and placement - Chord diagram (circlize package) in R

+0

'chordDiagram'將數據幀上工作,以及矩陣..看到'?chordDiagramFromDataFrame' – gjabel

+0

@gjabel感謝您的及時回覆。如果我設法解決我自己,我會看看並回應。 –

+0

我用你附上的代碼試了你的六行數據(用'head(m)'),沒有發生錯誤。你能附上完整的數據集嗎?另一方面,'chordDiagram()'可以直接應用於數據幀,不需要將其轉換爲矩陣。 –

回答

0

與感謝@ZuguangGu,該錯誤信息的原因是在我的專欄名稱NAs。如果你先將它們移除,那麼和絃圖就會顯示出來。遵循相同的符號,請參見下文。

#create adjacency matrix 
m <- data.frame(PORT_DE = VMS_by_trips$PORT_DE_Label, 
       PORT_LA = VMS_by_trips$PORT_LA_Label, 
       SCALLOP_W = VMS_by_trips$Trip_SCALLOP_W) 


#Check for NA values in your dataset 
which(is.na(m[, 1])) 
which(is.na(m[, 2])) 

#Remove the rows which have NA values, there will not be errors any more. 
df = m 
df = df[!(is.na(df[[1]]) | is.na(df[[2]])), ] 

require(reshape2) 
m <- dcast(df, PORT_DE ~ PORT_LA, value.var = "SCALLOP_W", fun.aggregate = sum) 
row.names(m) <- m[,1] 
m <- as.matrix(m[, -1]) 

# remove self-links 
m2 = m 
cn = intersect(rownames(m2), colnames(m2)) 
for(i in seq_along(cn)) { 
    m2[cn[i], cn[i]] = 0 
} 

# Export 3 versions of the chord diagram in a PDF 

library(circlize) 

pdf("test.pdf") 

# Use all data 
chordDiagram(m) 
title("using all data") 

#remove self-links 
chordDiagram(m2) 
title("remove self-links") 

#here reduce = 0.01 means to remove ports which have capacity less than 0.01 of capacity of all ports. 
chordDiagram(m2, reduce = 0.01) 
title("remove self-links and small sectors") 

dev.off()