【发布时间】:2016-06-07 17:05:15
【问题描述】:
我在 R 中有一个数据表(您需要安装数据表包),它使用 X 和 Y 坐标以及来自正态分布和均匀分布的随机数据值生成。坐标代表 2000x1600 阵列上的点,必须分成 16 个较小的“扇区”,每个 500x400。这些部门需要取它们的正态分布平均值,除以均匀分布值的 min^2。我还使用提供的函数 startstop 创建了两个变量 x 和 y,它们具有 16 个扇区的坐标和一个计算每个扇区的数字的函数。
library(data.table)
DT <- data.table(X = rep(1:2000, times = 1600), Y = rep(1:1600, each = 2000), Norm =rnorm(1600*2000), Unif = runif(1600*2000))
sectorCalc <- function(x,y,DT) {
sector <- numeric(length = 16)
for (i in 1:length(sector)) {
sect <- DT[X %between% c(x[[1]][i],x[[2]][i]) & Y %between% c(y[[1]][i],y[[2]][i])]
sector[i] <- sCalc(sect)
}
return(sector)
}
startstop <- function(width, y = FALSE) {
startend <- width - (width/4 - 1)
start <- round(seq(0, startend, length.out = 4))
stop <- round(seq(width/4, width, length.out = 4))
if (length(c(start,stop)[anyDuplicated(c(start,stop))]) != 0) {
dup <- anyDuplicated(c(start,stop))
stop[which(stop == c(start,stop)[dup])] <- stop[which(stop == c(start,stop)[dup])] - 1
}
if (y == TRUE) {
coord <- list(rep(start, each = 4), rep(stop, each = 4))
} else if (y == FALSE) {
coord <- list(rep(start, times = 4), rep(stop, times = 4))
}
return(coord)
}
x <- startstop(2000)
y <- startstop(1600, T)
sectorNos <- sectorCalc(x,y,DT)
startstop 函数并不是真正的问题,但我需要一种更快的方法来对数据表进行子集化。必须对“sectorCalc”函数进行一些修改。 for 循环是我能想到的最好方法,但我对数据表没有太多经验。关于更快地分解数据表的方法有什么想法吗?
【问题讨论】:
-
这个问题描述得非常好(包括示例数据和代码)。只是(真的)一点希望改进这个问题:在使用随机数创建样本数据时,您应该包括
set.seed,以便可以通过不同的答案重现结果。 -
这个功能我没用过。谢谢你的提示。 @RYoda
-
请避免以后大幅更改问题,因为它会使以前的答案无效。你能解释一下,你的功能是做什么的(意图?)。它看起来为 Norm 最低值的 2%(为什么是 2%?)计算类似于方差或 stddev 的东西。谢谢:-)
-
该函数只是一个分配的示例计算,它已提供。目的是成功地对数据表进行子集化并将函数应用于每个子集。我可以成功地做到这一点,我只是在寻找一种更快的方法来做到这一点。 @RYoda
-
根据@RYoda 的评论,我建议将此问题恢复为您的原始问题,然后接受其中一个答案(如果它们对您有用)。然后,接受你的新要求并提出一个新问题(但链接回这个问题)。
标签: r for-loop indexing data.table subset