如何制作';对于(){}';R中的代码更简单?

如何制作';对于(){}';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

多亏了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
在这里,我想将“数据库”转换为“数据网络”,如下所示:

>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结构可能不会太困难。感谢您的帮助。