我正在嘗試vectorise的一個可重複的代碼示例。向量化包含一個語句和函數的for循環
cutOffs <- seq(1,10,0.2)
plotOutput <- matrix(nrow=length(cutOffs), ncol=2)
colnames(plotOutput) <- c("x","y")
plotOutput[,"y"] <- cutOffs
for(plotPoint in 1:length(cutOffs))
{
plotOutput[plotPoint, "x"] <-
nrow(iris[ which(iris$Sepal.Length > cutOffs[plotPoint] &
iris$Sepal.Width > cutOffs[plotPoint]), ])
}
plotOutput
具體而言,我期望找到的是,如果有一種方法來引導這部分。
nrow(iris[ which(iris$Sepal.Length > cutOffs[plotPoint] &
iris$Sepal.Width > cutOffs[plotPoint]), ])
比方說,我是使用plyr庫或某種形式的應用,有可能是沒有太大的加快,這真的是我要找的。基本上,我試圖看看是否有一些技術用於矢量化,這是我在搜索時忽略或設法錯過的。
UPDATE:
Unit: milliseconds
expr min lq mean median uq max neval
op() 33663.39700 33663.39700 33663.39700 33663.39700 33663.39700 33663.39700 1
jr() 3976.53088 3976.53088 3976.53088 3976.53088 3976.53088 3976.53088 1
dd() 4253.21050 4253.21050 4253.21050 4253.21050 4253.21050 4253.21050 1
exp() 5085.45331 5085.45331 5085.45331 5085.45331 5085.45331 5085.45331 1
nic() 8719.82043 8719.82043 8719.82043 8719.82043 8719.82043 8719.82043 1
sg() 16.66177 16.66177 16.66177 16.66177 16.66177 16.66177 1
的什麼我實際上做一個更現實的近似是這個
# generate data
numObs <- 1e5
iris <- data.frame(Sepal.Length = sample(1:numObs), Sepal.Width = sample(1:numObs))
cutOffs <- 1:(numObs*0.01)
plotOutput <- matrix(nrow=length(cutOffs), ncol=2)
colnames(plotOutput) <- c("x","y")
plotOutput[,"y"] <- cutOffs
其次是一個更喜歡哪個特定的方法。
一般來說,它將用於50,000 - 200,000點的數據集。
有使用
sum(Sepal.Length > cutOffs[plotPoint] & Sepal.Width > cutOffs[plotPoint])
這就是我失蹤擺在首位更優化的方式一個大的跳躍。
到目前爲止,最好的答案是sgibb's sg()。關鍵在於意識到它只是每一行中兩個值中最低的值。一旦出現了這種心理跳躍,就只剩下一個單獨的矢量來處理矢量化問題了。
# cutOff should be lower than the lowest of Sepal.Length & Sepal.Width
m <- pmin(iris$Sepal.Length, iris$Sepal.Width)
確實用'findInterval'(+1)。這也是我的出發點,但是我失敗了,結果出現了一個更加複雜的「切割」代碼。 – Henrik