我正在使用data.table 1.9.3,也许我错了,但我不记得之前的预期.
我构建了2个data.tables,dta和dtb
> dta
idx vala fdx
1: 1 2 a
2: 2 4 a
3: 3 6 b
> dtb
idx valb
1: 1 3
2: 4 6
> dput(x = dta)
structure(list(idx = c(1, 2, 3), vala = c(2, 4, 6), fdx = c("a",
"a", "b")), .Names = c("idx", "vala", "fdx"), row.names = c(NA,
-3L), class = c("data.table", "data.frame"), .internal.selfref =
<pointer: 0x0000000000110788>, sorted = "idx")
> dput(x = dtb)
structure(list(idx = c(1, 4), valb = c(3, …
Run Code Online (Sandbox Code Playgroud) 是否可以在同一语句中更新data.table的1列以上?
就像是
dt[,onecol:=1 anothercol:=2]
Run Code Online (Sandbox Code Playgroud)
我见过他们做过的一些例子
dt[,c("onecol","anothercol"):=1]
Run Code Online (Sandbox Code Playgroud)
但我不知道如何为每列分配不同的公式
检查data.table中是否存在值的最快方法是什么?假设
i
参数中使用的任何东西[.data.table
我现在正在做
NROW(dt[keys,nomatch=0])!=0
Run Code Online (Sandbox Code Playgroud)
有什么更快的吗?
例
require(data.table)
iniDate = as.Date("2000-01-01")
theData = data.table(a = LETTERS, d = seq(from=iniDate ,to= iniDate + length(LETTERS)*3000-1,by="day"))
theKeys = data.table(a = c("J","M","T"), d = as.Date(c("2005-01-20","2005-05-20","2013-01-12")))
setkey(theData,a,d)
NROW(theData[theKeys],nomatch=0)!=0
Run Code Online (Sandbox Code Playgroud) 我有一个大数据集(大约20万行),其中每一行都是贷款.我有贷款金额,付款数量和贷款支付.我正试图获得贷款利率.R没有计算它的函数(至少基数R没有它,我找不到它).编写npv和irr函数并不难
Npv <- function(i, cf, t=seq(from=0,by=1,along.with=cf)) sum(cf/(1+i)^t)
Irr <- function(cf) { uniroot(npv, c(0,100000), cf=cf)$root }
Run Code Online (Sandbox Code Playgroud)
你可以做到
rate = Irr(c(amt,rep(pmt,times=n)))
Run Code Online (Sandbox Code Playgroud)
问题是当您尝试计算大量付款的费率时.因为uniroot没有矢量化,并且因为rep需要花费大量时间,所以最终会导致计算速度变慢.如果你做一些数学计算并发现你正在寻找下面等式的根源,你可以加快速度
zerome <- function(r) amt/pmt-(1-1/(1+r)^n)/r
Run Code Online (Sandbox Code Playgroud)
然后将其用作uniroot的输入.在我的电脑上,这需要大约20秒来运行我的200k数据库.
问题是我正在尝试进行一些优化,这是优化的一个步骤,所以我试图加快它的速度.
我已经尝试了矢量化,但由于uniroot没有矢量化,我不能再这样了.有没有矢量化的根发现方法?
谢谢