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)