如何在R中使'for(){}'代码更简单?

时间:2014-03-24 03:09:45

标签: 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

我想转换' dataBase'到#data;数据网络'如下所示:

>dataNetwork
From    To
A       P
A       Q
B       P
B       Q
B       R
B       X

根据Robert Krzyzanowski回答我的问题,Reduce似乎很有用。你还有其他有用的方法吗?


我是R的新手,并制作了将csv文件转换为网络文件(From,To)的代码,用于Pajek中的网络分析,使用' for(){}'如下。我知道有一种很好的方法可以使用apply函数系列在R中使代码更简单,但我并不习惯它。那么,你能帮我把这段代码变得更简单吗? 提前谢谢。

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 
}

1 个答案:

答案 0 :(得分:1)

此处并不需要lapply,因为您实际上使用的是先前计算的结果。我们可以使用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)