我对Dplyr和Data.Table的时间感到不满意. 令我惊讶的是,将dplyr :: mutate()的结果重新分配到一个新数据.帧似乎比不这样做更快. 为什么会发生这种情况? library(data.table) library(tidyverse) dt % mutate(MONTH = month(as.Date(DATE))) d
以下是关于 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.
我仍然是一个相对较新的用户,但是我正在试图矢量化我的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
我正在做一个循环以填充向量,但是这个循环需要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
我想在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.
我需要循环浏览数据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
所以这就是情况.我有一个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
这似乎应该很容易,但是我找不到答案:(. 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
我正在尝试为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,并且此命令似乎
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 &
我不确定我可以在这里问这个问题,让我知道我是否应该在其他地方做. 我有一个数据.表,有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)]