我有几个不同的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,那么速度非常慢,显然比逐个读取文件需要花费很多时间.我想知道这里出了什么问题,速度提升有什么改进吗?
我试图llply在plyr包中,有是没有太大的速度上涨.
此外,是否有任何语法data.table实现垂直连接喜欢rbind和unionin sql?
谢谢.
我不知道如何在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选项?
非常感谢!
这是手册中的解释 .BY
.BY是一个列表,其中包含每个项目的长度为1的向量by.如果by事先不知道,这可能很有用.该by变量也可用于j直接通过名称; 例如,对于图形标题,如果j是绘图命令,或者if()根据组变量的值进行分支,则是有用的.
它说"如果j是绘图命令,或者if()根据组变量的值进行分支,则对图形标题很有用."
但是,我还不确定何时使用.如何从中受益.BY?
你举一个例子吗?非常感谢!
我想用来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.table或dplyr.
在data.table默认情况下with = TRUE和j被评估在框架内的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) 请查看虚假数据集.
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进行回归是愚蠢的.
有代码可以达到目的吗?
谢谢
在检查了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,
但我失去了一些如何继续,这个新功能的目的是什么.你能提供一个例子来说明这一点吗?
非常感谢!
我有一个包含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)
任何提示或建议?
很抱歉这个问题很长.我会尽力澄清我的目标
我想使用更新方法在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年).
在这里,我想根据日期添加假人.
日期有几个特殊的时间跨度,我们可以用假期代表它们.
例如,在我上面创建的假数据中.
有两个假期
我想添加两种类型的假人
预期的结果是这样的:
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 …
我很高兴找到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]
如果你能给出一些详细的解释,真的很感激!