Tag: data.table

按升序/降序快速sortingdata.table

我有一个约300万行和40列data.table。 我想按照下面的SQL模拟代码按照降序sorting这个表: sort by ascending Year, ascending MemberID, descending Month data.table中有一个等价的方法来做到这一点? 到目前为止,我必须将其分解成2个步骤: setkey(X, Year, MemberID) 这是非常快的,只需要几秒钟。 X <- X[,.SD[order(-Month)],by=list(Year, MemberID)] 这一步需要更长的时间(5分钟)。 更新:有人发表评论做X <- X[sort(Year, MemberID, -Month)] ,后来被删除。 这种方法似乎要快得多: user system elapsed 5.560 11.242 66.236 我的方法:setkey()然后命令(-Month) user system elapsed 816.144 9.648 848.798 我现在的问题是:如果我想在Year,MemberId和Month(Year,MemberID,Month)之后进行总结,data.table是否能识别sorting顺序? 更新2:回应Matthew Dowle: 设置Year,MemberID和Month后,我仍然有多组logging。 我想要对每个组进行总结。 我的意思是:如果我使用X [order(Year,MemberID,Month)],求和是否利用data.table的二进制searchfunction: monthly.X <- X[, lapply(.SD[], sum), by = […]

如何优化读取和写入R中的matrix的子节(可能使用data.table)

TL; DR R中用于读取和写入非常大matrix列的子集的最快方法是什么? 我试图用data.table解决scheme,但需要一个快速的方式来提取一系列的列? 简答:操作的昂贵部分是分配。 因此,解决scheme是坚持使用matrix,并使用Rcpp和C ++来修改matrix。 下面有两个很好的答案,其中有些例子适用于其他问题,请务必阅读解决scheme中的免责声明! 滚动到问题的底部,了解更多的经验教训。 这是我的第一个堆栈溢出问题,我非常感谢你的时间在看,我很抱歉,如果我什么都没有留下。 我正在研究一个R包,其中我有一个性能瓶颈,从子集化和写入到matrix的某些部分(对统计学家来说,应用程序在处理每个数据点后更新足够的统计信息)。 单独的操作非常快,但它们的数量要求尽可能快。 这个想法的最简单版本是一个维度K乘以V的matrix,其中K一般在5到1000之间,V可以在1000到1000000之间。 set.seed(94253) K <- 100 V <- 100000 mat <- matrix(runif(K*V),nrow=K,ncol=V) 然后我们结束对列的一个子集进行计算并将其添加到完整的matrix中。 因此天真的看起来像 Vsub <- sample(1:V, 20) toinsert <- matrix(runif(K*length(Vsub)), nrow=K, ncol=length(Vsub)) mat[,Vsub] <- mat[,Vsub] + toinsert library(microbenchmark) microbenchmark(mat[,Vsub] <- mat[,Vsub] + toinsert) 因为这样做很多次,所以R的copy-on-change语义会很慢(但是看到下面的经验教训,在一些情况下实际上可以进行修改)。 对于我的问题,该对象不需要是matrix(我对这里所描述的区别非常敏感) 将一个matrix分配给data.table的一个子集 。 我总是想要整列,所以数据框的列表结构是好的。 我的解决scheme是使用Matthew Dowle的真棒data.table包。 写入可以使用set()非常快速地完成。 不幸的是,获得价值有点复杂。 我们必须使用= […]

R data.table滑动窗口

使用data.table包实现滑动窗口函数的最佳(最快)方法是什么? 我试图计算滚动中位数,但每个date有多个行(由于2个额外的因素),我认为这意味着动物园rollapplyfunction将无法正常工作。 这是一个使用天真for循环的例子: library(data.table) df <- data.frame( id=30000, date=rep(as.IDate(as.IDate("2012-01-01")+0:29, origin="1970-01-01"), each=1000), factor1=rep(1:5, each=200), factor2=1:5, value=rnorm(30, 100, 10) ) dt = data.table(df) setkeyv(dt, c("date", "factor1", "factor2")) get_window <- function(date, factor1, factor2) { criteria <- data.table( date=as.IDate((date – 7):(date – 1), origin="1970-01-01"), factor1=as.integer(factor1), factor2=as.integer(factor2) ) return(dt[criteria][, value]) } output <- data.table(unique(dt[, list(date, factor1, factor2)]))[, window_median:=as.numeric(NA)] for(i in […]

在data.table列中分割文本string

我有一个脚本,它将CSV文件中的数据读入到data.table ,然后将一列中的文本分成几个新列。 我目前使用lapply和strsplit函数来做到这一点。 这是一个例子: library("data.table") df = data.table(PREFIX = c("A_B","A_C","A_D","B_A","B_C","B_D"), VALUE = 1:6) dt = as.data.table(df) # split PREFIX into new columns dt$PX = as.character(lapply(strsplit(as.character(dt$PREFIX), split="_"), "[", 1)) dt$PY = as.character(lapply(strsplit(as.character(dt$PREFIX), split="_"), "[", 2)) dt # PREFIX VALUE PX PY # 1: A_B 1 AB # 2: A_C 2 AC # 3: A_D 3 AD […]

在data.table中joininheritance范围

我在data.table 1.9.3,也许我错了,但我不记得之前预计以下。 我build立了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 […]

将数据框转换为data.table而无需复制

我有一个很大的数据框(大约几GB),我想转换为data.table 。 使用as.data.table会创build一个数据框的副本,这意味着我需要可用的内存至less是数据大小的两倍。 有没有办法转换没有副本? 这里有一个简单的例子来演示: library(data.table) N <- 1e6 K <- 1e2 data <- as.data.frame(rep(data.frame(rnorm(N)), K)) gc(reset=TRUE) tracemem(data) data <- as.data.table(data) gc() 输出: library(data.table) # data.table 1.8.10 For help type: help("data.table") N <- 1e6 K <- 1e2 data <- as.data.frame(rep(data.frame(rnorm(N)), K)) gc(reset=TRUE) # used (Mb) gc trigger (Mb) max used (Mb) # Ncells 303759 16.3 […]

在data.table中过滤掉重复/非唯一的行

我有一个约250万行data.table表。 有两列。 我想要删除两列中重复的行。 以前对于data.frame,我会做这个: df -> unique(df[,c('V1', 'V2')])但是这不适用于data.table。 我试过unique(df[,c(V1,V2), with=FALSE])但它似乎仍然只对data.table的键而不是整行进行操作。 有什么build议么? 干杯,戴维 例 >dt V1 V2 [1,] AB [2,] AC [3,] AD [4,] AB [5,] BA [6,] CD [7,] CD [8,] EF [9,] GG [10,] AB 在上面的data.table中, V2是表键,只有行4,7和10将被删除。 > dput(dt) structure(list(V1 = c("B", "A", "A", "A", "A", "A", "C", "C", "E", "G"), V2 = c("A", […]

按位置从data.table中提取一列作为vector

如何从data.table中提取一列作为vector的位置? 下面是我尝试过的一些代码片段: DT<-data.table(x=c(1,2),y=c(3,4),z=c(5,6)) DT # xyz #1: 1 3 5 #2: 2 4 6 我想要使​​用列位置得到这个输出 DT$y #[1] 3 4 is.vector(DT$y) #[1] TRUE 用列位置获得这个输出的其他方法 DT[,y] #[1] 3 4 is.vector(DT[,y]) #[1] TRUE 这不给一个向量 DT[,2,with=FALSE] # y #1: 3 #2: 4 is.vector(DT[,2,with=FALSE]) #[1] FALSE 这两个不起作用: DT$noquote(names(DT)[2]) # Doesn't work #Error: attempt to apply non-function DT[,noquote(names(DT)[2])] # Doesn't work […]

select/分配给data.tablevariables名称存储在一个字符向量中

如果variables名存储在字符向量中,如何引用data.table的variables? 例如,这适用于data.frame : df <- data.frame(col1 = 1:3) colname <- "col1" df[colname] <- 4:6 df # col1 # 1 4 # 2 5 # 3 6 我怎样才能执行相同的操作data.table,无论有或没有:=符号? dt[ , list(colname)]的显而易见的东西不起作用(我也没有期望它)。

从data.table中删除多个列

什么是从data.table中删除多个列的正确方法? 我目前正在使用下面的代码,但是当我不小心重复了其中一个列名时出现意外的行为。 我不确定这是否是一个错误,或者我不应该这样删除列。 library(data.table) DT <- data.table(x = letters, y = letters, z = letters) DT[ ,c("x","y") := NULL] names(DT) [1] "z" 以上工作正常,但 DT <- data.table(x = letters, y = letters, z = letters) DT[ ,c("x","x") := NULL] names(DT) [1] "z"