Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R数据帧列比较,无for循环,复杂情况_R_Performance_For Loop_Iteration_Transformation - Fatal编程技术网

R数据帧列比较,无for循环,复杂情况

R数据帧列比较,无for循环,复杂情况,r,performance,for-loop,iteration,transformation,R,Performance,For Loop,Iteration,Transformation,假设我有一个具有以下参数的数据帧 数据以下是我的写作方法,其中包括我作为注释编写的所有3个优化。还有,小心!您的代码在寻址列时有一些错误。。。我希望这也能解决 require('compiler') enableJIT(3) DATA2 = as.matrix(DATA) META2 <- matrix(character(),ncol=5,nrow=(nrow(DATA2)*(ncol(DATA2)-2)^2/2)) # you want a matrix instead of a da

假设我有一个具有以下参数的数据帧


数据以下是我的写作方法,其中包括我作为注释编写的所有3个优化。还有,小心!您的代码在寻址列时有一些错误。。。我希望这也能解决

require('compiler')
enableJIT(3)
DATA2 = as.matrix(DATA)
META2 <- matrix(character(),ncol=5,nrow=(nrow(DATA2)*(ncol(DATA2)-2)^2/2)) # you want a matrix instead of a data.frame, and you want to pre-allocate its size
colnames(META2) = c("ROWID","ID1","BUS1","ID2","BUS2")
k=0
for (i in 1:nrow(DATA2)) {
  for (x in seq(3,ncol(DATA2)-2,2)) {
    for (y in seq(x+2,ncol(DATA2),2)) {
      k=k+1
      META2[k,] = c(DATA2[i,1],DATA2[i,x-1], DATA2[i,x], DATA2[i,y-1], DATA2[i,y]) # no need to use temporary variables
    }
  }
}
META2 = as.data.frame(META2)  # converting back to data.frame
META2$BUS1 = as.numeric(META2$BUS1)
META2$BUS2 = as.numeric(META2$BUS2)
require('compiler'))
启用JIT(3)
数据2=作为矩阵(数据)

META2如果您提供一个数据框中有多少行,以及您希望在META中有多少行,将更容易提供帮助?问题至少对我来说不是很清楚,你能添加更多吗?是
ID1
ID2
等等。这些实际字符串,而
ROWID1
NAME1
NAME2
是用值填充的变量吗?我支持对示例数据的请求。这里有两个主要的优化问题。1.您可以通过添加行来增加data.frame。。这是非常低效的。看见2.您使用了很多临时变量:ID1、BUS1等等。摆脱它们将使您的代码更快。(另外,您的代码中有一个输入错误:BUS2应该声明为character(),而不是numeric()),当我这么做时:当您执行大量循环时,添加require(“编译器”)和enableJIT(3)以加快代码的速度。(请参阅)只需稍作调整,即可完美运行!非常感谢您提供了一个富有成效的答案,并帮助我从全新的角度看待数据。我将从中带走几件珍宝,非常感谢您的宝贵时间。BUS1和BUS2 not NA的添加也使得结果表小得多。我发现所需矩阵行大小的公式是((ncol*(ncol+1))/2)*nrow,这也非常有用。干杯
ROWID1 | ID1 | NAME1 | ID2 | NAME2
ROWID1 | ID1 | NAME1 | ID3 | NAME3
...
ROWID1 | ID2 | NAME2 | ID3 | NAME3
...
ROWID2 | ID1 | NAME1 | ID2 | NAME2
ROWID2 | ID1 | NAME1 | ID3 | NAME3
...
DATA <- data.frame(as described above)
META <- data.frame(ROWID=numeric(0),ID1=numeric(0),
                   BUS1=character(0),ID2=numeric(0),BUS2=character(0))
for (i in 1:length(DATA$ROWID)) {
  SET <- data.frame(ROWID=numeric(0),ID1=numeric(0),
                   BUS1=character(0),ID2=numeric(0),BUS2=character(0))
  ROWID <- DATA[i,1]
       for (x in seq(3,ncol(DATA),2)) {
       for (y in seq(x,ncol(DATA),2)) {
             ID1 <- DATA[i,x-2]
             BUS1 <- DATA[i,x]
             ID2 <- DATA[i,y-2]
             BUS2 <- DATA[i,y]
             if (!is.na(BUS1) && !is.na(BUS2)) {
             NEW <- cbind(ROWID, ID1, BUS1, ID2, BUS2)
             SET <- rbind(SET, NEW)
                                    }
            }
         }
           META <- rbind(META, SET)
       }
require('compiler')
enableJIT(3)
DATA2 = as.matrix(DATA)
META2 <- matrix(character(),ncol=5,nrow=(nrow(DATA2)*(ncol(DATA2)-2)^2/2)) # you want a matrix instead of a data.frame, and you want to pre-allocate its size
colnames(META2) = c("ROWID","ID1","BUS1","ID2","BUS2")
k=0
for (i in 1:nrow(DATA2)) {
  for (x in seq(3,ncol(DATA2)-2,2)) {
    for (y in seq(x+2,ncol(DATA2),2)) {
      k=k+1
      META2[k,] = c(DATA2[i,1],DATA2[i,x-1], DATA2[i,x], DATA2[i,y-1], DATA2[i,y]) # no need to use temporary variables
    }
  }
}
META2 = as.data.frame(META2)  # converting back to data.frame
META2$BUS1 = as.numeric(META2$BUS1)
META2$BUS2 = as.numeric(META2$BUS2)