gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:43:06 29 4
gpt4 key购买 nike

我有一个 data.table , DT其中包含一列 C具有满足不等式的实值条目 0 < x <= 1 .我想按时间间隔对这些条目进行“分组”,例如10. 具体到所有值xC这样 0 < x <=0.1我想将值 0.1 分配给所有值 xC这样 0.1 < x <=0.2我想赋值0.2等等

下面是我编写的函数,我认为它可以让我做到这一点(放轻松,我是 R 的新手!)。

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)]

出现以下错误:

Warning messages:
1: In v[i] = i/10 * (x > (i - 1)/10 & x <= i/10) :
number of items to replace is not a multiple of replacement length
2: In v[i] = i/10 * (x > (i - 1)/10 & x <= i/10) :
number of items to replace is not a multiple of replacement length
...
10: In v[i] = i/10 * (x > (i - 1)/10 & x <= i/10) :
number of items to replace is not a multiple of replacement length

非常感谢任何帮助!干杯

最佳答案

(更快的)替代方法是使用 findInterval,它与 cut 的工作非常相似,但避免了 to-factor 和from-factor 转换

  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

关于r - 在 data.table 的列中“分组”实数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14853848/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com