作者locka (locka)
看板R_Language
标题Re: [问题] CSV资料切割
时间Thu Feb 23 16:02:35 2023
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
: -------------------------------------------------------------------
: 谢谢各位的解答,我收益良多
: 如今我有一个衍伸的问题
: 如果我要将这4个分开的矩阵做同样的运算并且将最终运算结果整理到同一个档案中的话
: 除了一笔一笔运算外,有没有比较快的方式?
: 我使用的指令如下
: 承续locka的指令
: library(igraph)
: #将4个输出档案汇入
: data1 <- read.csv("chunk_0.csv", header=T, sep=",",row.names = 1)
: data2 <- read.csv("chunk_1.csv", header=T, sep=",",row.names = 1)
: data3 <- read.csv("chunk_2.csv", header=T, sep=",",row.names = 1)
: data4 <- read.csv("chunk_3.csv", header=T, sep=",",row.names = 1)
: #自定义一个运算函数
: test=function(X){
: A=graph.adjacency(t(X), mode="directed",weighted =T)
: result=topov=cbind(result1=graph.strength(A, mode = "in"),
: result2=graph.strength(A, mode = "out"))
: return(list(result=result))
: }
: #将4个汇入档案分别计算
: output1 = test(data1)
: output2 = test(data2)
: output3 = test(data3)
: output4 = test(data4)
: #将4个计算结果合并并输出
: result1_all = as.data.frame(cbind(output1$result[,1],output2$result[,1],output
: 3$result[,1],output4$result[,1]))
: result2_all = as.data.frame(cbind(output$result[,2],output2$result[,2],output3
: $result[,2],output4$result[,2]))
: write_csv(result1_all,"result1_all")
: write_csv(result2_all,"result2_all")
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.129.15.178 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1677139357.A.155.html
1F:推 haitairoutzu: 谢谢版主的建议及提醒,我之後会留意 谢谢 02/24 13:31