更快速地分配数据表而不是for循环R.

时间:2016-02-25 04:47:34

标签: r for-loop indexing data.table subset

我在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循环是我能想到的最佳方式,但我对数据表没有太多经验。有关更快打破数据表的方法的任何想法吗?

2 个答案:

答案 0 :(得分:3)

要替换您的Accounts.onCreateUser(function(options, user){ user.subreddits = []; console.log(user); return user; }); Meteor.publish('users', function(){ return Meteor.users.find().fetch(); }); SinglePost = React.createClass({ getInitialState: function(){ Meteor.subscribe('users'); return { }; }, deletePost: function(){ var post_to_delete = {_id: this.props.id} Posts.remove(post_to_delete); }, showMeInfo: function(){ console.log(Meteor.user()); }, render: function(){ return ( <div> <li> <button onClick={this.deletePost}> Click Me!</button> {this.props.title}: {this.props.content} </li> <p><button onClick={this.showMeInfo}> Show Me Info! </button> </p> </div> ); } }); 函数,我认为我们可以使用sectorCalc的联接

当您循环遍历data.table的每一行时,您只需创建一个sector即可加入data.table数据, 指定要加入的列(此处我使用sector),并为每行指定一个“组”变量,以使我们能够执行 最后的计算:

key_col

答案 1 :(得分:3)

不仅使用包sklearn.linear_model.Ridge而且使用data.table函数构建间隔“groups”的解决方案:

cut

请注意:我认为原始解决方案中第一个和第二个间隔的大小是错误的(499而不是500而x和399而不是400,因此我无法使用# Create your test data library(data.table) set.seed(123) # make random numbers reproducible to allow comparison of different answers DT <- data.table(X = rep(1:2000, times = 1600), Y = rep(1:1600, each = 2000), Norm =rnorm(1600*2000), Unif = runif(1600*2000)) # calculate the sector by cutting the x and y values into groups defined by the interval breaks DT[, x.sect := cut(DT[, X], c(0, 499, 1000, 1500, 2000), dig.lab=10)] # Intervals should be: seq(0, 2000, by=500) lower bound is less one since it is not included in the interval (see help for cut function) DT[, y.sect := cut(DT[, Y], c(0, 399, 800, 1200, 1600), dig.lab=10)] # Intervals should be: seq(0, 1600, by=400) # Now calculate per group (calculation logic "stolen" from the working answer of user "Symbolix" DT[, .(sect = mean(Norm)/min(Unif)^2), by=.(x.sect, y.sect)] 函数可以重现所需的时间间隔,但必须手动枚举间隔时间。)

编辑1:我已经用改进的解决方案替换了添加x.sect和y.sect列的原始代码,该解决方案按引用添加列(seq)。

编辑2:如果您想订购结果,您至少有两个选项:

:=

编辑3 :在上面的代码中为# "Chaining" (output is input of next) DT[, .(sect = mean(Norm)/min(Unif)^2), by=.(x.sect, y.sect)][order(x.sect, y.sect),] # Or: Use the "keyby" param instead of "by" DT[, .(sect = mean(Norm)/min(Unif)^2), keyby=.(x.sect, y.sect)] 函数添加了dig.lab=10 param,以避免间隔中断的科学记数法。