我有一个data.table
,DT
,其中包含一列C
,其中包含满足不等式0 < x <= 1
的实数值条目。我希望按照例如以下的间隔对这些条目进行“分组”。 10.具体来说,对于x
中的所有值C
,0 < 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)]
任何帮助非常感谢!干杯
答案 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 = 1
和x = C
:
DT[,1/10 * (C > (1-1)/10 & C <= 1/10)]
你会注意到你得到一个长度相同C
的向量。错误在于您无法指定长度为&gt;的向量。 1到v[i]
。最好逐步执行您的功能(使用debug
,traceback
和browser
等功能),以确保您获得正确的输入。
这是让你的功能发挥作用的一种方法:
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]