在data.table的列中“分组”实数

时间:2013-02-13 12:43:12

标签: r data.table

我有一个data.tableDT,其中包含一列C,其中包含满足不等式0 < x <= 1的实数值条目。我希望按照例如以下的间隔对这些条目进行“分组”。 10.具体来说,对于x中的所有值C0 < x <=0.1我要将值0.1分配给x中的所有值C,以便{ {1}}我想指定值0.2等

以下是我写过的函数,我认为这可以让我这样做(很简单,我对R来说比较新!)。

0.1 < x <=0.2

其中r = function(x,N){ v = numeric(10) for(i in 1:N) v[i] = i/N*(x>(i-1)/N & x<=i/N) v = v[v!=0] return(v) } 是我需要的间隔数。但是,代码:

N

给出以下错误:

DT = DT[,newC:=r(x=C,N=10)]

任何帮助非常感谢!干杯

2 个答案:

答案 0 :(得分:4)

(更快)替代方案是使用findInterval,它与cut的工作非常相似,但避免转到 - factor和 - factor转化< / p>

  z1 <- findInterval(x,y)
  z1 <- tail(y,-1)[z1]

还有一些基准测试

cutting <- function(){
  z <- cut(x,y,labels=tail(y,-1))
  #this generates a factor: 
  #you can convert it back to numeric
   z <- as.numeric(levels(z))[z]
  }

finding <- function(){
 z1 <- findInterval(x,y)
 z1 <- tail(y,-1)[z1]
}

microbenchmark(cutting(),finding())


##     Unit: microseconds
##       expr    min       lq   median      uq     max
## 1 cutting() 188.50 192.1175 193.6275 195.821 354.701
## 2 finding()  34.18  35.5140  37.5620  38.763  46.397

答案 1 :(得分:2)

如果您在函数中尝试使用for循环,请使用i = 1x = C

DT[,1/10 * (C > (1-1)/10 & C <= 1/10)]

你会注意到你得到一个长度相同C的向量。错误在于您无法指定长度为&gt;的向量。 1到v[i]。最好逐步执行您的功能(使用debugtracebackbrowser等功能),以确保您获得正确的输入。

这是让你的功能发挥作用的一种方法:

r = function(x,N){

  for(i in 1:N)
    x[x>(i-1)/N & x<=i/N] <- i/N
  return(x)

}

R也有这样做的内置方式:

#sample data
set.seed(1)
x <- runif(100)
#to organize your data
y <- seq(0,1,.1)
z <- cut(x,y,labels=tail(y,-1))
#this generates a factor: 
#you can convert it back to numeric
z <- as.numeric(levels(z))[z]