提高data.table子集的性能
我正在运行一个大型蒙特卡洛模拟,我发现子制定/搜索数据是我代码中最慢的部分.为了测试一些替代方案,我用数据范围,data.table和矩阵进行了标记的性能. 这是基准代码: library(data.table) #install.packages('profvis') library(profvis) x.df = data.frame(a=sample(1:10,10000,replace=T), b=sample(1:10,10000,replace=T)) # set up a dataframe x.dt = as.data.table(x.df) # a data.table setkey(x.dt,a) # set key for faster searches x.mat = as.matrix(x.df) # a matrix profvis({ for (i in 1:10000) { # test simple subsetting xsubset.
0 2023-05-24
编程技术问答社区
在R中使用矢量化提高循环效率
我仍然是一个相对较新的用户,但是我正在试图矢量化我的for循环以提高计算速度.当前,我需要在数据上执行两个子集.FRAME/DATA.TABLE df(仅以本文命名):1)按Group id和2)每个时间间隔interval子集子集id.我设置了一个嵌套for循环,因为我需要在每个数据子集之间执行差异测试的均匀性,并使用lawstat软件包中的levene.test进行控件.该测试与多个小组相关,因为它报告了一个值,因此需要该子集.您还会注意到我的原始代码(请参见下文)记录了每个测试的p.value to a .csv file-by-Row. 有21,840个子集(id和interval的唯一组合),循环需要354.65秒才能完成. library(lawstat) library(data.table) df
0 2023-05-24
编程技术问答社区
R编程 :如何加快一个需要2小时的循环,以及需要大量时间的原因
我正在做一个循环以填充向量,但是这个循环需要2个小时.我不知道这是否是因为我可能正在做一些事情,或者仅仅是因为循环缓慢.我必须在此部分使用一个循环,因为我需要以前的值,所以我不能对操作进行矢量化. 我正在使用软件包data.table. 我的笔记本电脑具有8GB RAM,Intel Core i5 Pro 2.3GHz. R版本64位3.2.3 该表具有以下结构(由numdcred和FDES升序): NUMDCRED FDES Flag_Entrada_Mora Flag_Salida_Mora 0001 "2012-01-01" 0 0 0001 "2012-03-01" 1 0 0001 "2012-04-01" 0 0 0
0 2023-05-24
编程技术问答社区
在R中以最快和最有效的方式将大数据框架的行作为参数传递给一个函数
我想在data.frame myDF中构建一个新列,这是函数getval将本行中的元素作为参数中的元素返回的值. getval还使用外部向量v1作为参数.例如: myn = 1000 a = seq(0, 1, length.out = myn) b = seq(-1, 1, length.out = myn) myDF = expand.grid(a=a, b=b) set.seed(13) v1 = rnorm(100) getval = function(a, b, v) { return(sum(a*v + b/2*v)) } myDF$val = apply(myDF, 1, function(x) {getval(a=x[1], b=x[2], v=v1)}) head(myDF) # a b val # 1 0.000000000 -1 3.091267 # 2 0.001001001 -1 3.085078 # 3 0.
0 2023-05-24
编程技术问答社区
使用R排除观测值后,快速找到组中的min的方法
我需要在一个非常大的数据集(带有许多组)上做类似下面的事情,然后阅读使用.sd慢的地方.是否有更快的方法执行以下操作? 更准确地说,我需要创建一个新列,该列在排除该组中的观测值之后包含每个组的最小值(类似于Excel中的Minif). library(data.table) dt test valid a k valid_min 1: 0 1 A 1 2: 1 1 A 1 3: 1 2 A
2 2023-05-24
编程技术问答社区
反复的子集可以使这个过程更快
我需要循环浏览数据Table2 DT2,对于每行,请检查数据Table1 DT1中的某些条件是否有匹配. 我目前这样做.这在DT1中查看我在DT2中拥有的数据.在循环中,您会看到: subset = DT1[DT1$time == DT2$time[i] & DT1$a == DT2$a[i] & DT1$b == DT2$b[i] & (DT1$cat == DT2$cat1[i] | DT1$cat == DT2$cat2[i] ) & DT1$Flag ==0] 如果有匹配,我需要 1-标记在DT1中匹配的行,因此我不再匹配它.在用DT1$Flag[match$RowNumber] = 1 完成的代码中 2-填充DT2中的一列,并带有来自DT1中相应列的数据 在用 完成的代码中 DT2$x[i] = match$x 这几乎就是这样,但这有效,但是DT1可能是10,000行,而DT2可能是100,000行,因此对于我所在的每10,000
0 2023-05-24
编程技术问答社区
r数据.
所以这就是情况.我有一个8500万行桌,有18列.这些列中的三个具有公制前缀/si符号的值(请参阅 metric prefix 在Wikipedia上). 这意味着我有类似的数字: .1m而不是100000或1E+5,或 1K而不是1000或1E+3 样本数据.表是 V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 1: 2014-03-25 12:15:12 58300 3010 44.0 4.5 0.0 0 0 0.8 50 0.8 10K 303 21K 0 a 56 2: 2014-03-25 12:15:12 56328 3010 28.0 12.0 0.0 0 0 0.3 60 0.0 59 62 .1M 0 a 66 3: 2014-03-25 12:15:12 21
2 2023-05-24
编程技术问答社区
将每一行数据归一化.表
这似乎应该很容易,但是我找不到答案:(. normalize 0) { return(x/s) } else { return 0 } } 如何在数据的每一行上调用此函数.表并获取归一化数据.我可以做一个循环,但这肯定不是正确的方法,apply(data, 1, normalize)我理解,将我的数据转换为矩阵,这将是一个很大的性能. 解决方案 这是避免强迫矩阵的一种方法: cols = names(DT) DT[, s := Reduce("+",.SD)] DT[s > 0, (cols) := lapply(.SD,"/",s), .SDcols = cols] DT[s
0 2023-05-23
编程技术问答社区
更快地等同于R中的group_by %>% expand
我正在尝试为R中的多个ID创建一个年的序列.我的输入表对每个ID都有一个行,并给出一个start_ year.看起来这样: ID Start_year 01 1999 02 2004 03 2015 04 2007 等... 我需要为每个ID创建一个带有多行的表,每年从他们的start_year到2015年.然后,我将使用它加入另一个表.因此,在我的示例中,ID1在1999年:2015年会有17行. ID2将有12行2004:2015,ID3将有1行2015,ID4将有9行2007:2015. 对于我的数据子集,我可以使用以下代码使此功能工作: df %>% group_by(ID) %>% expand(year = Start_year:2015, Start_year) %>% select(-Start_year) 但是,我的完整数据集大约有500万个ID,并且此命令似乎
0 2023-05-23
编程技术问答社区
fread(): 读取带有换行符号的表格
我在文本文件中具有选项卡 - 删除的表,其中所有行都以\r\r\n(0x0D 0x0D 0x0A)结尾.如果我尝试使用fread()读取此类文件,则说 线结束是\ r \ r \ n. R的下载.file()似乎添加了额外的\ r 在Windows上的文本模式中.请在二进制模式下再次下载 (模式='WB')也可能更快.或者,通过URL 直接要fread,它将以二进制模式下载文件 你. 但是我没有下载这些文件,我已经有它们. 到目前为止P> mydt
2 2023-05-23
编程技术问答社区
计算一定范围内的行数
i有一个数据.表有一些值('value'),下限('min_val')和上限('max_val'): | value | min_val | max_val | 1: | 94.001 | 94.00 | 94.02 | 2: | 94.002 | 94.00 | 94.03 | 3: | 94.003 | 94.01 | 94.04 | 4: | 95 | 94.98 | 95.02 | 我想计算一个值> min_val&value 的值 | value | min_val | max_val | count | 1: | 94.001 | 94.00 | 94.02 | 1 | #(num of value(s) > 94.00 &
2 2023-05-23
编程技术问答社区
提高data.table日期+时间粘贴的性能?
我不确定我可以在这里问这个问题,让我知道我是否应该在其他地方做. 我有一个数据.表,有1e6行具有此结构: V1 V2 V3 1: 03/09/2011 08:05:40 1145.0 2: 03/09/2011 08:06:01 1207.3 3: 03/09/2011 08:06:17 1198.8 4: 03/09/2011 08:06:20 1158.4 5: 03/09/2011 08:06:40 1112.2 6: 03/09/2011 08:06:59 1199.3 我使用此代码将V1和V2变量转换为唯一的DateTime变量: system.time(DT[,`:=`(index= as.POSIXct(paste(V1,V2), format='%d/%m/%Y %H:%M:%S'), V1=NULL,V2=NULL)]
0 2023-05-23
编程技术问答社区