【发布时间】:2015-03-30 17:42:40
【问题描述】:
Stack Overflow 的新手,尽管我已经检查你们发布和回答的内容已经有一段时间了(只是在我的硕士课程工作时没有时间加入)。
TL;DR:我使用此处提供的脚本来处理如下结构的数据集,以获取网络的边缘。它有效,但处理时间太长(2k 行需要 24 小时)。对初学者 R 用户有什么提高速度的提示吗?
在我的上一个研究项目中,我最终得到了一个类似于以下内容的 data.frame:
ID | Trait 1 | Trait 2 | Trait 3 | Trait 4 | Trait 5
01 | TRUE | TRUE | Photo | City | Portrait
02 | FALSE | TRUE | Draw | Child | Portrait
03 | TRUE | FALSE | Photo | Misc | Landscape
.
.
.
这持续了大约 2k 行。目的是建立一个网络,其中每个 ID 都是一个节点,两个 ID 之间的共同特征之和将构成一个加权边,即 ID 01 对 ID 2 和 3 都有一个权重 2 边,而 ID 2 将对 ID 3 没有优势。
为了解决这个问题,我使用了以下脚本,该脚本遍历每一行比较每一列的值以增加权重(每个匹配 = +1),忽略已经比较的行(作为无向网络,没有必要同时匹配两种方式) :
键:来源 = 要比较的 ID;目标 = 正在比较的 ID;权重 = 匹配单元格/特征的总和。
findEdges <- function(){
input <- read.csv("nodes.csv",header=TRUE,stringsAsFactors=FALSE,sep=";")
edges <- read.csv("edges.csv",header=TRUE,stringsAsFactor=FALSE,skip=1,colClasses=c("integer","integer","integer"),col.names=c("Source","Target","Weight"))
for(i in 1:nrow(input)){ #row to be compared: Source
for(j in 1:nrow(entrada)){ #rows that will compare to: Target
weight <- 0
if( i >= j ){
} else {
for(k in 1:ncol(input)){ #column by column comparison
col <- k
if(input[i,k] == input[j,k]){ #edge weight modifier
weight <- weight+1
}
}
print(c("source= ",i,"target= ",j,"weight= ",weight)) #visual feedback of running script
newRow <- data.frame(Source=i,Target=j,Weight=weight) #create row for compared pair
edges <- rbind(edges,newRow) # add edge row to data frame
}
}
}
write.csv(edges,"edges.csv") #write data frame to csv file
}
findEdges()
效果很好,给了我需要的加权边缘列表。边缘列表的每一行将呈现为:
Source | Target | Weight
01 | 02 | 2
01 | 03 | 2
等等……
但是,这个脚本花了将近 24 小时来处理整个数据集(2k 行,5 列,除了 ID),虽然这在以前不是问题,但我认为最好检查一些关于更好/更快的提示获得相同结果的方法。
【问题讨论】:
-
要阅读有关
edges <- rbind(edges, newRow)行的(负面)效率影响的一些信息,我建议(The R Inferno)[burns-stat.com/pages/Tutor/R_inferno.pdf] 的第 2 圈。 -
谢谢,马上去看看 :)
标签: r algorithm networking