我对这里的一切都很陌生。我试图付出更多努力使我的代码可读。我正在编写运行多个文件的函数的代码。我有超过100个文件,每个文件包含时间(会话)的边缘列表,如下所示:
Header: Time Sender Receiver
1 1 2
1 1 3
2 2 1
2 2 1
3 1 2
3 1 2
该功能的目的是根据“时间”从每个文件中提取子网络。由于有3个不同的时间段,每个文件将有3个子网络。以下是我写的代码:
SubsetNetwork <-function (file) {
df = read.csv(file)
uniq <-unique(unlist(df$Time))
edgelist=list()
g=list()
for (i in 1:length(uniq)){
g <- lapply(split(df, df$Time), function(x) {
graph.edgelist(as.matrix(x[c("Sender","Receiver")]), directed = T)
})
edgelist[[i]]=get.edgelist(g[[i]])
filename=paste(fname, i, ".csv")
write.csv(edgelist[[i]], filename)
}
}
此代码将运行上面的函数。
temp = list.files(pattern="*.csv")
for (i in 1:length(temp)){
file <-temp[i]
SubsetNetwork (file)
}
我一直收到错误(Error in g[[i]] : subscript out of bounds
)。如果我一个接一个地运行代码,它似乎有效。但是,如果我输入多个文件,它会为多个文件生成输出并停止工作。我无法弄清楚导致问题的原因。
答案 0 :(得分:0)
如果您的代码对一个文件工作正常,那么您收到的错误表明它不是您的代码的问题。如果唯一时间点的数量是&lt; g[[i]]
,则temp <- list.files(*.csv)
只会超出范围。 1。
我怀疑正在发生的事情是文件格式错误或损坏,缺少SubsetNetwork <-function (file) {
df = read.csv(file)
uniq <-unique(unlist(df$Time))
正在接收的“时间”标题。
由于你不习惯编写代码,我会经历,批评和修复一些事情:
data.frames
unlist
的列只是向量,因此您不需要 uniq <-unique(df$Time)
。代替:
edgelist=list()
g=list()
for (i in 1:length(uniq)){
g <- lapply(split(df, df$Time), function(x) {
graph.edgelist(as.matrix(x[c("Sender","Receiver")]), directed = T)
})
edgelist[[i]]=get.edgelist(g[[i]])
filename=paste(fname, i, ".csv")
write.csv(edgelist[[i]], filename)
}
}
足够了。
for
您可能实际上并不需要lapply
循环。 split
数据框的get.edgelist
将返回整个列表,因此可以移出循环。如果 g <- lapply(split(df, df$Time), function(x) {
graph.edgelist(as.matrix(x[c("Sender","Receiver")]), directed = T)
})
edgelist <- lapply(g, get.edgelist)
for (i in 1:length(uniq)){
filename=paste(fname, i, ".csv")
write.csv(edgelist[[i]], filename)
}
}
被矢量化,那么它也可以移动到循环之外。因为我实际上并不知道我会认为这不仅仅是为了安全:
uniq
现在,您还不需要unique
,因为g
个时间点的数量只是edgelist
和filename=paste(fname, i, ".csv")
的长度。
当paste
时,fname 1 .csv
函数会在每个参数之间插入空格(即fname1.csv
而不是sep=""
。您可以指定paste
来更改paste0
的行为或使用SubsetNetwork <-function (file) {
df = read.csv(file)
g <- lapply(split(df, df$Time), function(x) {
graph.edgelist(as.matrix(x[c("Sender","Receiver")]), directed = T)
})
edgelist <- lapply(g, get.edgelist)
for (i in 1:length(g)){
filename=paste0(fname, i, ".csv")
write.csv(edgelist[[i]], filename)
}
}
作为速记。
将所有重新组合在一起:
{{1}}