Re: [问题] CSV资料切割

楼主: locka (locka)   2023-02-23 16:02:35
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
:
作者: haitairoutzu (海苔肉粽)   2023-02-24 13:31:00
谢谢版主的建议及提醒,我之后会留意 谢谢

Links booklink

Contact Us: admin [ a t ] ucptt.com