library(igraph)
library(tidyverse)
library(readr)
# 儲存最終結果的空dataframe
result_df <- data.frame()
callback_f <- function(x, pos){
# 測試資料裡有variable的變數,須把它拿掉變成square matrix
# 才可以做graph.adjacency()
x <- x[,-1]
# 做你要的計算(graph.adjacency)
A <- graph.adjacency(t(x), mode="directed", weighted=T)
result_chunk <- cbind(result1=graph.strength(A,mode="in"),
result2=graph.strength(A,mode="out"))
print(result_chunk) # 印出每個chunk計算的結果,確認答案用,可註解
result_chunk # 回傳結果
}
# 將運算結果存到result_df
result_df <- read_csv_chunked("demo.csv",
DataFrameCallback$new(callback_f),chunk_size=4)
result_df
程式碼好讀版
https://i.imgur.com/KYgt8fV.jpg
執行結果
https://i.imgur.com/L9cHuiI.jpg
補充1
個人是建議盡量不要使用把原始資料拆成很多個.csv檔
然後再重新讀進來做運算
因為檔案的讀取跟寫入(I/O)是最花時間的,資料量大的時候更明顯
readr套件提供的read_csv_chunked()即是一次讀一小段資料進來
透過callback_f這個參數,定義資料讀進來後要做的事情再整合在一起
callback function 可以做任何事
可以寫檔(像上次你問的一樣)、也可以做計算
那既然你還要一個一個讀進來計算graph.adjacency,然後還要結果整合成一個df
不如直接寫在callback function 裡面
補充2
下次請在程式碼裡加入載入的套件(除非你都使用原生函數)
不是每個人都知道graph.adjacency()是哪個套件提供的function
直接複製你的程式碼沒辦法執行,還要去查才知道是igraph套件
這樣會降低版友的回答慾望喔~~
注意小細節,創造對回答者友善的交流環境:)
感謝您!
小小板工下台一鞠躬
※ 引述《haitairoutzu (海苔肉粽)》之銘言:
: ※ 引述《locka (locka)》之銘言:
: : library(tidyverse)
: : library(readr)
: : # 產生測試資料
: : demo <- tibble(variable=1:16,
: : id1=rnorm(16),
: : id2=rnorm(16),
: : id3=rnorm(16),
: : id4=rnorm(16))
: : write_csv(demo, "demo.csv")
: : # 使用read_csv_chunked() 每4row切割並輸出成一個新的檔案
: : callback_f <- function(x, pos) write_csv(x, paste0("chunk_",pos%/%4,".csv"))
: : read_csv_chunked("demo.csv", DataFrameCallback$new(callback_f), chunk_size=4
: )
: : 結果如下:
: : 原資料
: : https://i.imgur.com/y3GmbSh.jpg
: : 輸出4個檔案
: : https://i.imgur.com/5b2pzEi.jpg
: