为了摆脱data.frame名为“foo”的data.frame ,我可以这样做: df <- df[-grep('foo', colnames(df))] 但是,一旦df被转换为data.table对象,就没有办法只删除一列。 例: df <- data.frame(id = 1:100, foo = rnorm(100)) df2 <- df[-grep('foo', colnames(df))] # works df3 <- data.table(df) df3[-grep('foo', colnames(df3))] 但是,一旦它被转换成data.table对象,这不再起作用。
我最近遇到了python的pandas库,根据这个基准testingperformance出非常快的内存合并。 它甚至比R中的data.table包(我select分析的语言)更快。 为什么pandas比data.table ? 是因为python比R有一个固有的速度优势,还是有一些折衷,我不知道? 有没有办法在data.table执行内部和外部连接,而不是通过merge(X, Y, all=FALSE)和merge(X, Y, all=TRUE) ? 以下是用于对各种软件包进行基准testing的R代码和Python代码 。
例如(不知道如果最有代表性的例子): N <- 1e6 d1 <- data.frame(x=sample(N,N), y1=rnorm(N)) d2 <- data.frame(x=sample(N,N), y2=rnorm(N)) 这是我到目前为止: d <- merge(d1,d2) # 7.6 sec library(plyr) d <- join(d1,d2) # 2.9 sec library(data.table) dt1 <- data.table(d1, key="x") dt2 <- data.table(d2, key="x") d <- data.frame( dt1[dt2,list(x,y1,y2=dt2$y2)] ) # 4.9 sec library(sqldf) sqldf() sqldf("create index ix1 on d1(x)") sqldf("create index ix2 on d2(x)") […]
我想使用foverlaps来查找两个bed文件的相交范围,并将包含重叠范围的所有行合并成一行。 在下面的例子中,我有两个基因组范围的表。 这些表被称为“床”文件,其具有基于零的起始坐标和染色体中的特征的一个基于终点的位置。 例如,START = 9,STOP = 20被解释为跨越基数10到20(含)。 这些床文件可以包含数百万行。 解决scheme需要给出相同的结果,无论提供两个文件相交的顺序如何。 第一个表 > table1 CHROMOSOME START STOP 1: 1 1 10 2: 1 20 50 3: 1 70 130 4: X 1 20 5: Y 5 200 第二个表 > table2 CHROMOSOME START STOP 1: 1 5 12 2: 1 15 55 3: 1 60 65 4: […]
我正在使用R中的一个非常大的数据集,并且一直在使用dataframe,并决定切换到data.tables以帮助加速操作。 我无法理解的J操作,特别是我试图生成虚拟variables,但我不知道如何编码data.tables []内的条件操作。 MWE: test <- data.table("index"=rep(letters[1:10],100),"var1"=rnorm(1000,0,1)) 我想要做的就是将列a到j添加为虚拟variables,使得列a在index == "a"时具有值1 ,否则为0 。 在data.frame环境中,它看起来像这样: test$a <- 0 test$a[test$index=='a'] <- 1
我开始在R中使用data.table包来提高我的代码的性能。 我正在使用下面的代码: sp500 <- read.csv('../rawdata/GMTSP.csv') days <- c("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday") # Using data.table to get the things much much faster sp500 <- data.table(sp500, key="Date") sp500 <- sp500[,Date:=as.Date(Date, "%m/%d/%Y")] sp500 <- sp500[,Weekday:=factor(weekdays(sp500[,Date]), levels=days, ordered=T)] sp500 <- sp500[,Year:=(as.POSIXlt(Date)$year+1900)] sp500 <- sp500[,Month:=(as.POSIXlt(Date)$mon+1)] 我注意到,与其他创build工作日的函数相比,由as.Date函数完成的转换非常缓慢。为什么? 有更好/更快的解决scheme,如何转换成date格式? (如果你问我是否真的需要date格式,可能是的,因为然后使用ggplot2来绘制情节,就像这种types的数据一样。 更确切地说 > system.time(sp500 <- sp500[,Date:=as.Date(Date, "%m/%d/%Y")]) user system elapsed 92.603 0.289 93.014 > system.time(sp500 <- […]
刚刚和同事谈了这件事情,我们认为值得看看SO土地上的人不得不说什么。 假设我有一个包含N个元素的列表,其中每个元素都是一个长度为X的向量。现在假设我想将其转换为一个data.frame。 与R中的大多数事物一样,有许多方法可以将谚语猫皮肤化,比如as.dataframe ,使用plyr软件包,与cbind结合使用do.call ,预先分配DF并填充它们等等。 提出的问题是当N或X(在我们的例子中是X)变得非常大时会发生什么。 有效的猫(特别是在记忆方面)的本质是否有一种猫皮方法明显优越?
我想计算一个data.table中的几个列的每一个的平均值,由另一列分组。 我的问题类似于另外两个关于SO的问题( 一个和两个 ),但我不能将这些问题用于我的问题。 这里是一个例子: library(data.table) dtb <- fread(input = "condition,var1,var2,var3 one,100,1000,10000 one,101,1001,10001 one,102,1002,10002 two,103,1003,10003 two,104,1004,10004 two,105,1005,10005 three,106,1006,10006 three,107,1007,10007 three,108,1008,10008 four,109,1009,10009 four,110,1010,10010") dtb # condition var1 var2 var3 # 1: one 100 1000 10000 # 2: one 101 1001 10001 # 3: one 102 1002 10002 # 4: two 103 1003 10003 # 5: two […]
dplyr是惊人的快,但我不知道我是否缺less的东西:是否有可能总结了几个variables。 例如: library(dplyr) library(reshape2) (df=dput(structure(list(sex = structure(c(1L, 1L, 2L, 2L), .Label = c("boy", "girl"), class = "factor"), age = c(52L, 58L, 40L, 62L), bmi = c(25L, 23L, 30L, 26L), chol = c(187L, 220L, 190L, 204L)), .Names = c("sex", "age", "bmi", "chol"), row.names = c(NA, -4L), class = "data.frame"))) sex age bmi chol 1 boy 52 […]
我想在一个data.table中创build一个新的列,根据一列的当前值和另一列的前一个值来计算。 是否有可能访问以前的行? 例如: > DT <- data.table(A=1:5, B=1:5*10, C=1:5*100) > DT ABC 1: 1 10 100 2: 2 20 200 3: 3 30 300 4: 4 40 400 5: 5 50 500 > DT[, D := C + BPreviousRow] # What is the correct code here? 正确的答案应该是 > DT ABCD 1: 1 10 100 NA […]