Tag: data.table

如何使用data.table:=高效地计算坐标对之间的距离

我想find最有效(最快)的方法来计算lat长度坐标对之间的距离。 已经提出了一个不太有效的解决scheme(在这里)使用sapply和spDistsN1{sp} 。 我相信如果使用:=运算符在data.table使用spDistsN1{sp}那么这可能会变得更快,但是我一直无法做到这一点。 有什么build议么? 这是一个可重现的例子 : # load libraries library(data.table) library(dplyr) library(sp) library(rgeos) library(UScensus2000tract) # load data and create an Origin-Destination matrix data("oregon.tract") # get centroids as a data.frame centroids <- as.data.frame(gCentroid(oregon.tract,byid=TRUE)) # Convert row names into first column setDT(centroids, keep.rownames = TRUE)[] # create Origin-destination matrix orig <- centroids[1:754, ] dest <- centroids[2:755, […]

使用!= <某些非NA>子集化data.table也不包括NA

我有一个数据表。 我想删除那些列的特定值的行(这恰好是"" )。 但是,我的第一次尝试也导致我失去了NA的行: > a = c(1,"",NA) > x <- data.table(a);x a 1: 1 2: 3: NA > y <- x[a!=""];y a 1: 1 看完了?`!=` ,我发现了一个可以工作的class轮,但是这很痛苦: > z <- x[!sapply(a,function(x)identical(x,""))]; z a 1: 1 2: NA 我想知道是否有更好的方法来做到这一点? 另外,我没有看到扩展这个排除多个非NA值的好方法。 这是一个坏方法: > drop_these <- function(these,where){ + argh <- !sapply(where, + function(x)unlist(lapply(as.list(these),function(this)identical(x,this))) + ) + if (is.matrix(argh)){argh […]

查找间隔集合/高效重叠联接之间的重叠

概述: 我需要join两个表格: ref包含时间间隔(从t1到t2 )以及每个间隔的id和发生间隔的space 。 map包含时间间隔( t1到t2 ),每个时间间隔都有一个结果res和相应的space 。 我希望获得/join所有的间隔(和他们的分数)的map ,属于ref ref的时间间隔。 例: ref <- data.table(space=rep('nI',3),t1=c(100,300,500),t2=c(150,400,600),id=letters[1:3]) map <- data.table(space=rep('nI',241),t1=seq(0,1200,by=5),t2=seq(5,1205,by=5),res=rnorm(241)) 他们看着像是: > ref space t1 t2 id 1: nI 100 150 a 2: nI 300 400 b 3: nI 500 600 c > map space t1 t2 res 1: nI 0 5 -0.7082922 2: nI 5 […]

在data.table中select列的子集R

我有一堆列的数据表,例如: dt<-data.table(matrix(runif(10*10),10,10)) 我想对数据表执行一些操作,比如产生一个相关matrix( cor(dt) )。 为了做到这一点,我想删除一些包含非数字值或一定范围以外的值的列。 假设我想要find不包括V1,V2,V3和V5的相关matrix。 这是我目前的做法: cols<-!(colnames(dt)=="V1" | colnames(dt)=="V2" | colnames(dt)=="V3" | colnames(dt)=="V5") new_dt<-subset(dt,,cols) cor(new_dt) 我觉得这很麻烦,考虑data.table语法通常是如此的优雅。 有没有更好的方法来做到这一点?

使用二进制search而不是vector扫描,仅对2列密钥的第二列对data.table进行子集化

我最近在data.table发现了二进制search。 如果表格按多个键sorting,则可以仅在第二个键上search? DT = data.table(x=sample(letters,1e7,T),y=sample(1:25,1e7,T),rnorm(1e7)) setkey(DT,x,y) #R> DT[J('x')] # xy V3 # 1: x 1 0.89109 # 2: x 1 -2.01457 # — #384922: x 25 0.09676 #384923: x 25 0.25168 #R> DT[J('x',3)] # xy V3 # 1: x 3 -0.88165 # 2: x 3 1.51028 # — #15383: x 3 -1.62218 #15384: x 3 […]

为什么在分组的data.table中使用lm上的更新会丢失模型数据?

好吧,这是一个奇怪的。 我怀疑这是data.table内部的一个bug,但是如果有人能解释为什么会发生这种情况,那么这将是有用的 – update在做什么? 我在data.table里面使用list(list())技巧来存储拟合的模型。 当您为不同的分组创build一个lm对象序列,然后update这些模型时,所有模型的模型数据将变为最后一个分组的模型数据。 这似乎是一个参考挂在哪里应该有一个副本,但我无法find哪里,我不能在lm之外重现此update 。 具体例子: 从虹膜数据开始,先将这三种物种的样本大小进行比较,然后对每个物种进行lm模型拟合,更新这些模型: set.seed(3) DT = data.table(iris) DT = DT[rnorm(150) < 0.9] fit = DT[, list(list(lm(Sepal.Length ~ Sepal.Width + Petal.Length))), by = Species] fit2 = fit[, list(list(update(V1[[1]], ~.-Sepal.Length))), by = Species] 原始数据表的每个种类都有不同的数字 DT[,.N, by = Species] # Species N # 1: setosa 41 # 2: versicolor 39 # […]

有没有比rbind.fill(list)有效的方法?

我有一个不同的列的数据框列表,我想把它们合并成一个数据框。 我使用rbind.fill来做到这一点。 我正在寻找更有效的方法。 类似于这里给出的答案 require(plyr) set.seed(45) sample.fun <- function() { nam <- sample(LETTERS, sample(5:15)) val <- data.frame(matrix(sample(letters, length(nam)*10,replace=TRUE),nrow=10)) setNames(val, nam) } ll <- replicate(1e4, sample.fun()) rbind.fill(ll)

R用data.table总结多个列

我正在尝试使用data.table来加速处理由几个较小的合并数据框架组成的大数据框(300k x 60)。 我是data.table的新手。 目前的代码如下 library(data.table) a = data.table(index=1:5,a=rnorm(5,10),b=rnorm(5,10),z=rnorm(5,10)) b = data.table(index=6:10,a=rnorm(5,10),b=rnorm(5,10),c=rnorm(5,10),d=rnorm(5,10)) dt = merge(a,b,by=intersect(names(a),names(b)),all=T) dt$category = sample(letters[1:3],10,replace=T) 我想知道是否有比以下更有效的方式来总结数据。 summ = dt[i=T,j=list(a=sum(a,na.rm=T),b=sum(b,na.rm=T),c=sum(c,na.rm=T), d=sum(d,na.rm=T),z=sum(z,na.rm=T)),by=category] 我真的不想用手input所有的50列计算,而eval(paste(…))似乎笨重。 我看了下面的例子,但是对于我的需求来说似乎有些复杂。 谢谢 如何总结一个data.table跨多个列

data.table连接然后添加列到现有data.frame没有重新复制

我有两个data.tables ,X(3行data.tables列)和Y(100行两列)。 set.seed(1) X <- data.table( a=letters, b=letters, c=letters, g=sample(c(1:5,7),length(letters),replace=TRUE), key="g" ) Y <- data.table( z=runif(6), g=1:6, key="g" ) 我想在X上做一个左外连接,我可以通过Y[X]来完成,这要归功于: 为什么data.tables的X [Y]连接不允许完整的外连接或左连接? 但是我想添加新的列到X 而不复制X (因为它是巨大的)。 很显然,像X <- Y[X]这样的东西是有效的,但是除非data.table远远超过我所称赞的(而且我相当相当多的歪曲!),我相信这会复制整个X 。 X[ , z:= Y[X,z]$z ]可以工作,但是非常好,不能很好地扩展到多个列。 如何以合理的方式将合并结果存储到保留的data.table中(无论是在副本方面还是在程序员时间方面)?

为什么在join带有重复键的data.tables时需要allow.cartesian?

我试图了解J()查找时的逻辑,当R中的data.table中有重复的键时 这是我尝试过的一个小实验: library(data.table) options(stringsAsFactors = FALSE) x <- data.table(keyVar = c("a", "b", "c", "c"), value = c( 1, 2, 3, 4)) setkey(x, keyVar) y1 <- data.frame(name = c("d", "c", "a")) x[J(y1$name), ] ## OK y2 <- data.frame(name = c("d", "c", "a", "b")) x[J(y2$name), ] ## Error: see below x2 <- data.table(keyVar = c("a", "b", "c"), […]