如何制作';对于(){}';R中的代码更简单?
多亏了Matthew Lundberg的评论,这里我附上了一个我想做的简单示例如何制作';对于(){}';R中的代码更简单?,r,R,多亏了Matthew Lundberg的评论,这里我附上了一个我想做的简单示例 >id = c("A", "B") >citations = c("P,Q", "P,Q,R,X") >dataBase = data.frame(id, citations) >dataBase id citations 1 A P,Q 2 B P,Q,R,X 在这里,我想将“数据库”转换为“数据网络”,如下所示: >dataNetw
>id = c("A", "B")
>citations = c("P,Q", "P,Q,R,X")
>dataBase = data.frame(id, citations)
>dataBase
id citations
1 A P,Q
2 B P,Q,R,X
在这里,我想将“数据库”转换为“数据网络”,如下所示:
>dataNetwork
From To
A P
A Q
B P
B Q
B R
B X
根据回答我问题的Robert Krzyzanowski的说法,Reduce
似乎很有用。你还有其他有用的方法吗
我是R新手,编写了将csv文件转换为网络文件(From,to)的代码,以便在Pajek中进行网络分析,使用下面的“for(){}”。我知道在R中使用apply函数族有一种很好的方法可以使代码更简单,但我还不习惯。因此,你能帮我简化一下这个代码吗? 提前谢谢
myFile = file.choose()
myData = read.csv(myFile)
dataa = data.frame(myData$colA, myData$colB)
id = as.vector(dataa[,1])
citationBase = strsplit(gsub(" \\|", "/", dataa[,2]), "/")
from = c(0)
to = c(0)
datab = data.frame(from, to)
m=1 #m: How many are the backward citations in the data?
for(i in 1:length(dataa[,1])){ #i: How many are the issue numbers in the data?
citations = as.vector(citBase[[i]])
k=1
for(m in m:(m+length(citations)-1)){
datab[m,1] = id[i]
datab[m,2] = citations[k]
k = k+1
}
m = m+1
}
这里实际上不需要使用
lappy
,因为您实际使用的是前面的计算结果。我们可以使用Reduce
来保持它的功能。顺便说一下,注意在外循环的每个迭代中,m
是i
datab <- Reduce(function(df, i) {
citations <- as.vector(citBase[[i]])
inner_seq <- seq(m, m + length(citations)-1)
df[inner_seq, ] <- list(rep(id[i], length(inner_seq)), citations[inner_seq - m + 1])
df
}, seq_len(nrow(dataa)), datab)
datab请在问题中加入示例数据,使其可复制。IGRAPHE软件包可以导出为pajek格式,将数据导入IGRAPHE结构可能不会太困难。感谢您的帮助。