小编Big*_*hao的帖子

使用data.table快速读取和组合多个文件(带有fread)

我有几个不同的txt文件具有相同的结构.现在我想用fread将它们读入R,然后将它们组合成一个更大的数据集.

## First put all file names into a list 
library(data.table)
all.files <- list.files(path = "C:/Users",pattern = ".txt")

## Read data using fread
readdata <- function(fn){
    dt_temp <- fread(fn, sep=",")
    keycols <- c("ID", "date")
    setkeyv(dt_temp,keycols)  # Notice there's a "v" after setkey with multiple keys
    return(dt_temp)

}
# then using 
mylist <- lapply(all.files, readdata)
mydata <- do.call('rbind',mylist)
Run Code Online (Sandbox Code Playgroud)

代码工作正常,但速度不理想.每个txt文件有1M个观察值和12个字段.

如果我用它fread来读取单个文件,那就快了.但是使用apply,那么速度非常慢,显然比逐个读取文件需要花费很多时间.我想知道这里出了什么问题,速度提升有什么改进吗?

我试图llplyplyr包中,有是没有太大的速度上涨.

此外,是否有任何语法data.table实现垂直连接喜欢rbindunionin sql

谢谢.

r fread data.table

31
推荐指数
1
解决办法
1万
查看次数

关于data.table 1.9.2中的GForce

我不知道如何在data.table 1.9.2中充分利用GForce

新的优化:GForce.不是对数据进行分组,而是将组位置传递到sum和mean(gsum和gmean)的分组版本,然后计算单个顺序传递列中所有组的结果以获得缓存效率.此外,由于g*函数只被调用一次,我们不需要找到加速调用sum的方法或重复每个组的平均值.`

提交以下代码时

DT <- data.table(A=c(NA,NA,1:3), B=c("a",NA,letters[1:3]))
DT[,sum(A,na.rm=TRUE),by= B]
Run Code Online (Sandbox Code Playgroud)

我懂了

    B V1
1:  a  1
2: NA  0
3:  b  2
4:  c  3

DT[,sum(A,na.rm=FALSE),by= B]我尝试时,我得到了

    B  V1
1:  a  NA
2:  NA NA
3:  b  2
4:  c  3

这个结果是否解释了GForce的作用,添加na.rm = TRUE/FALSE选项?

非常感谢!

r data.table

14
推荐指数
1
解决办法
2019
查看次数

如何从data.table中的`.BY`中受益?

这是手册中的解释 .BY

.BY是一个列表,其中包含每个项目的长度为1的向量by.如果by事先不知道,这可能很有用.该by变量也可用于j直接通过名称; 例如,对于图形标题,如果j是绘图命令,或者if()根据组变量的值进行分支,则是有用的.

它说"如果j是绘图命令,或者if()根据组变量的值进行分支,则对图形标题很有用."

但是,我还不确定何时使用.如何从中受益.BY

你举一个例子吗?非常感谢!

r data.table

11
推荐指数
1
解决办法
506
查看次数

在data.table或dplyr中的列之间计算?

我想用来data.table为大型数据集实现一个非常简单的任务.

计算每个ID的val1和val2的平均值.

有关详细信息,请参阅附带的虚假数据.

library(data.table)
DT <- data.table(ID = paste0("ID",rep(1:5,each=2)),
      level= rep(c("CTRL","CTRL","ID1","ID2","ID3"),2),
      val1 = 1:10, 
      val2 = rnorm(10))
Run Code Online (Sandbox Code Playgroud)

在这里,我想计算每个ID,val1和val2的平均值.

另请注意,在每个ID中,都有不同的级别.但是对于每个唯一ID,我只想要一个包含不同级别val1和val2的意思.

--- ID | 意思 - -

- ID1 | ...

- ID2 | ...

- ID3 | ...

我尝试了以下代码,但它不起作用.

topagents <- DT[, mean = mean(list(val1,val2)), 
                    by = ID]
Run Code Online (Sandbox Code Playgroud)

但它不起作用.我知道怎么做reshape2,先是melt然后dcast.

但原始数据集相对较大,有20M行和12个字段,进行计算需要相当长的时间.

所以我更喜欢使用data.tabledplyr.

r dplyr data.table

8
推荐指数
4
解决办法
1330
查看次数

当使用:=时,为什么= TRUE是默认值?

data.table默认情况下with = TRUEj被评估在框架内x.然后,它有助于将列名用作变量.什么时候with = FALSE,j是一个名称或位置的矢量来选择.

我设法找到了一些例子with = FALSE.

set.seed(1234)
DT <- data.table(x=rep(c(1,2,3),each=4), y=c("A","B"), v=sample(1:100,12))

## The askers's solution
#first step is to create cumsum columns
colNames <- c("x","v"); newColNames <- paste0("SUM.",colNames)
DT[, newColNames := lapply(.SD,cumsum) ,by=y, .SDcols = colNames, with=FALSE];
test <- DT[, newColNames:=lapply(.SD,cumsum) ,by=y, .SDcols=colNames, with=TRUE];
Run Code Online (Sandbox Code Playgroud)

我们可以检查DT是:

> DT                       # setting `with=FALSE` - what I require
    x y  v SUM.x SUM.v …
Run Code Online (Sandbox Code Playgroud)

r data.table

6
推荐指数
1
解决办法
204
查看次数

在data.table中运行回归

请查看虚假数据集.

library(data.table)
library(MASS)
n=5000
DT = data.table(
      grp=1:n,
      name=as.character(as.hexmode(1:n)), 
      x= sample(c(1:400),n,replace = TRUE)
    )

setkey(DT,grp)

UIDlist <- unique(DT[,grp])
IDnamelist <- paste0("V", 1 : length(UIDlist), sep = "")
test <- DT[, (IDnamelist):=lapply(UIDlist,function(x) grp ==x)][, V5000:= NULL]
Run Code Online (Sandbox Code Playgroud)

我有一个data.table,其中有4列,"grp","Name","x","y".然后我在"grp"中的每个级别添加虚拟.然后我需要在MASS包中使用glm.nb运行回归.

首先我尝试了这个

SumResult <- glm.nb(x ~ factor(uid), data = test) 
Run Code Online (Sandbox Code Playgroud)

但是当添加假人时,我们必须注意到当"grp"中有N级时,我们会添加N-1个假人.所以这个方法就我认为不合适.

所以我尝试了这个:

SumResult <- glm.nb( x ~ V1 + V2 + V3 + V4 + .....+ V4999  , data = test)
Run Code Online (Sandbox Code Playgroud)

编写所有V1,V2,... V4999进行回归是愚蠢的.

有代码可以达到目的吗?

谢谢

r data.table

6
推荐指数
1
解决办法
280
查看次数

NA/NaN/Inf in data.table 1.9.2

在检查了data.table 1.9.2的新功能之后,我不太清楚操作NA/NaN/Inf的新功能.

新闻:

NA,NaN,+ Inf和-Inf现在被认为是不同的值,可以是键,可以加入并可以分组.data.table定义:NA <NaN <-Inf

我不知道"可以加入并可以分组"是什么意思

DT <- data.table(A=c(NA,NA,1:3), B=c("a",NA,letters[1:3]))
Run Code Online (Sandbox Code Playgroud)

现在我们在A列和B列都有NA,

但我失去了一些如何继续,这个新功能的目的是什么.你能提供一个例子来说明这一点吗?

非常感谢!

r data.table

6
推荐指数
1
解决办法
977
查看次数

折叠data.table中的行

我有一个包含1M行和2列的data.table

虚拟数据:

require(data.table)
ID <- c(1,2,3)
variable <- c("a,b","a,c","c,d")
dt <- data.table(ID,variable)
dt
> dt
Run Code Online (Sandbox Code Playgroud)
ID variable
1      a,b
2      a,c
3      c,d

现在我想通过"ID"将列"variable"折叠成不同的行,就像reshape2中的"melt"函数或data.table中的melt.data.table一样.

这就是我想要的:

ID variable
1  a
1  b
2  a
2  c
3  c
3  d 

PS:鉴于预期的结果,我知道如何做相反的步骤.

dt2 <- data.table(ID = c(1,1,2,2,3,3), variable = c("a","b","a","c","c","d"))
dt3 <- dt2[, list(variables = paste(variable, collapse = ",")), by = ID]
Run Code Online (Sandbox Code Playgroud)

任何提示或建议?

r data.table

6
推荐指数
1
解决办法
1529
查看次数

在data.table中添加有条件的假人?

很抱歉这个问题很长.我会尽力澄清我的目标

我想使用更新方法在data.table中添加虚拟对象,就像这个链接中已经回答的那样,但有点复杂.

为了更好的描述,我创建了数据.

DT <- data.table(UID = paste0("UID",rep(1:5,each=2)), 
                 date = as.IDate(c("2012-01-01","2012-01-02","2012-01-03","2012-01-04","2012-01-05","2012-01-06","2012-02-01","2012-02-02","2012-02-03","2012-02-04")),
                 value = c(1:10)) 
Run Code Online (Sandbox Code Playgroud)

DT是一个data.table,包含UID,日期和值的信息.在原始数据中,结构是相同的,但具有较长的时间跨度(2年).

在这里,我想根据日期添加假人.

日期有几个特殊的时间跨度,我们可以用假期代表它们.

例如,在我上面创建的假数据中.

有两个假期

  1. 从"2012-01-02"到"2012-01-05"
  2. 从"2012-02-02"到"2012-02-03"

我想添加两种类型的假人

  1. 关于假期长短的假人:首先计算不同假期的长度.在这个例子中,我们有两个不同的长度(2和4).因此,我们将添加2个虚拟对象,表明日期是否在这些假期中.

预期的结果是这样的:

UID     Date    Val D_length_2  D_length_4
UID1    1/1/2012    1   FALSE   FALSE
UID2    1/2/2012    2   FALSE   TRUE
UID3    1/3/2012    3   FALSE   TRUE
UID4    1/4/2012    4   FALSE   TRUE
UID5    1/5/2012    5   FALSE   TRUE
UID1    1/6/2012    6   FALSE   FALSE
UID2    2/1/2012    7   TRUE    FALSE
UID3    2/2/2012    8   TRUE    FALSE
UID4    2/3/2012    9   FALSE   FALSE
UID5    2/4/2012    10  FALSE …

r data.table

5
推荐指数
1
解决办法
1018
查看次数

关于data.table 1.9.2的新功能J()

我很高兴找到data.table有它的新版本,并得到一个关于J()的问题

x [J(2),a],其中'a'是关键列,在'j',#2693和FAQ 2.8中看到'a'.此外,x [J(2)]使用'x'的键列自动命名'i'中的列.在'x'和'i'的关键列相同的情况下,可以使用'i.name'来引用i的列; 例如,x [J(2),ia]`

在SO中有几个关于J()的问题,还有关于数据的介绍.关于J()的二进制搜索的讨论.但我对J()的理解还不是很清楚.

我所知道的是,如果我想选择A列中"b"和B列中"d"的行:

DT2 <- data.table(A= letters[1:5], B=letters[3:7], C=1:5)
setkey(DT2,A,B)
DT2[J("b","d")]
Run Code Online (Sandbox Code Playgroud)

如果我想选择A ="a"或"c"的行,我就像这样编码

DT2[A=="a"|A=="c"]
Run Code Online (Sandbox Code Playgroud)

很像data.frame方式.(小问题:如何使用更多data.table方式选择?)

所以据我所知,J()仅用于上述情况.从2个不同的列中选择两个单个值.

希望我的理解是错误的.关于J()的文件很少.我读了如何在data.table中实现J()函数?.J(.) is detected and simply replaced with list(.)

似乎每个案例列表(.)都可以替换J(.)

并回到这个问题,这个新功能的目的是什么? x[J(2), a]

如果你能给出一些详细的解释,真的很感激!

r data.table

5
推荐指数
1
解决办法
313
查看次数

标签 统计

data.table ×10

r ×10

dplyr ×1

fread ×1