javascript

git

python

java

git-remote

github

django

c#

reactjs

c++

git-commit

git-revert

validation

email-validation

undefined

scrum

kubernetes

ruby-on-rails

.net

.net-framework-version

R中的滚动联接data.table

我想进一步了解滚动连接的工作方式,并且感到有些困惑,我希望有人可以为我澄清这一点。 举一个具体的例子:

dt1 <- data.table(id=rep(1:5, 10), t=1:50, val1=1:50, key="id,t")
dt2 <- data.table(id=rep(1:5, 2), t=1:10, val2=1:10, key="id,t")

我希望这会产生一个长的roll=T,其中id中的值将进行滚动:

dt1[dt2,roll=TRUE]

相反,执行此操作的正确方法似乎是:

dt2[dt1,roll=TRUE]

有人可以向我详细说明roll=T的加入方式,因为我显然不正确地理解它。 我以为id相当于dt1的sql等效项,除了添加了功能locf。

另外,文档说:

X[Y] is a join, looking up X's rows using Y (or Y's key if it has one) 
as an index.

这使得似乎只应该返回X中的内容,而完成的联接是内部联接,而不是外部联接。 如果roll=T但在dt1中不存在特定的id,该怎么办? 多玩一点我不明白列中放置了什么值。

trans by 2020-08-04T13:44:20Z

为什么要定义data.table:=而不是重载<-?

data.table引入了:=运算符。 为什么不超载<-?

trans by 2020-08-01T18:13:22Z

r-在data.tab中插入一行

如果我有数据框

set.seed(12345) 
df=data.frame(a=rnorm(5),b=rnorm(5))

我可以通过添加一行

df[6,] =c(5,6)

如果我现在在data.table中执行等效操作

library(data.table)
dt=data.table(df)
dt[6,]=c(5,6)

它失败并显示错误。 将行插入到data.table中的正确方法是什么?

trans by 2020-07-31T07:05:08Z

R中的data.frame和data.table之间的实际区别是什么

这个问题已经在这里有了答案:

  • 使用data.frame不能使用data.table做什么? 1个答案

显然,在我的最后一个问题中,我表现出了data.framedata.table之间的混淆。诚然,我没有意识到两者之间的区别。

因此,我阅读了每种帮助,但用日常的日常用语来说,有什么区别,含义是什么,以及每种含义都可以帮助我正确使用它们?

trans by 2020-07-29T01:57:02Z

性能-如何优化R中矩阵的子部分的读写(可能使用data.table)

TL; DR

R中最快的读写子集的方法是什么 很大矩阵中的列。 我尝试使用data.table解决方案 但是需要一种快速的方法来提取列序列吗?

简短的回答:操作的昂贵部分是分配。 因此,解决方案是坚持使用矩阵,并使用Rcpp和C ++修改矩阵。 以下是带有示例的两个出色答案。[对于那些适用于其他问题的人,请务必阅读解决方案中的免责声明!]。 滚动到问题的底部,以获取更多的经验教训。


这是我的第一个“堆栈溢出”问题-非常感谢您抽出宝贵时间来看看,如果有什么遗漏,我深表歉意。 我正在研究一个R包,其中存在从子集到写入矩阵各部分的性能瓶颈(对于统计学家而言,NB是应用程序在处理每个数据点后会更新足够的统计信息)。 单个操作的速度非常快,但数量庞大,因此要求尽可能快。 这个想法的最简单形式是尺寸为K乘V的矩阵,其中K通常在5到1000之间,而V可以在1000到1,000,000之间。

set.seed(94253)
K <- 100
V <- 100000
mat <-  matrix(runif(K*V),nrow=K,ncol=V)

然后,我们最终对列的子集执行计算,并将其添加到完整矩阵中。因此天真地看起来

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的“按变化复制”的语义,它可能会非常慢(但请参阅下面的经验教训,在某些情况下实际上可以进行修改)。

对于我的问题,对象不必是矩阵(并且我对此处概述的差异很敏感,请将矩阵分配给data.table的子集)。 我一直想要完整的列,因此数据框的列表结构很好。 我的解决方案是使用Matthew Dowle的超赞data.table包。 使用set()可以非常快速地完成写入。 不幸的是,获得价值要复杂得多。 我们必须使用= FALSE来调用变量设置,这会大大降低速度。

library(data.table)
DT <- as.data.table(mat)  
set(DT, i=NULL, j=Vsub,DT[,Vsub,with=FALSE] + as.numeric(toinsert))

在使用i = NULL引用所有行的set()函数中,速度非常快,但是(大概是由于事物在内部存储的方式),没有可比的j选项。 @Roland在评论中指出,一种选择是转换为三重表示形式(行号,列号,值),并使用data.tables二进制搜索来加快检索速度。 我手动进行了测试,虽然速度很快,但它的存储需求大约是矩阵的三倍。 如果可能,我想避免这种情况。

在这里提出以下问题:是从data.table和data.frame对象获取单个元素的时间。 Hadley Wickham为单个索引提供了非常快速的解决方案

Vone <- Vsub[1]
toinsert.one <- toinsert[,1]
set(DT, i=NULL, j=Vone,(.subset2(DT, Vone) + toinsert.one))

但是,由于.subset2(DT,i)只是不带方法分派的DT [[i]],(据我所知)虽然看起来似乎应该有可能,但没有办法(据我所知)一次抓住几列。 与上一个问题一样,由于我们可以快速覆盖值,因此我们应该能够快速读取它们。

有什么建议? 还请让我知道是否有比data.table更好的解决方案。 我意识到它实际上并不是很多方面的预期用例,但我试图避免将整个操作系列移植到C上。

这是讨论的元素时序的顺序-前两列都是一列,后两列只是一列。

microbenchmark(mat[,Vsub] <- mat[,Vsub] + toinsert,
              set(DT, i=NULL, j=Vsub,DT[,Vsub,with=FALSE] + as.numeric(toinsert)),
              mat[,Vone] <- mat[,Vone] + toinsert.one,
              set(DT, i=NULL, j=Vone,(.subset2(DT, Vone) + toinsert.one)),
              times=1000L)

Unit: microseconds
                  expr      min       lq   median       uq       max neval
                Matrix   51.970   53.895   61.754   77.313   135.698  1000
            Data.Table 4751.982 4962.426 5087.376 5256.597 23710.826  1000
     Matrix Single Col    8.021    9.304   10.427   19.570 55303.659  1000
 Data.Table Single Col    6.737    7.700    9.304   11.549    89.824  1000

答案和经验教训:

注释将操作中最昂贵的部分确定为分配过程。 两种解决方案都基于C代码给出了答案,这些代码修改了矩阵,从而打破了R约定,即不修改函数的参数,而是提供更快的结果。

哈德利·威克汉姆(Hadley Wickham)在评论中停下来指出,只要未在其他地方引用对象垫,矩阵修改实际上就已完成(请参阅[http://adv-r.had.co.nz/memory.html#modification -in-place)。]这指向一个有趣而微妙的地方。 我正在RStudio中进行评估。 正如Hadley在书中指出的那样,RStudio为不在函数内的每个对象创建了一个附加引用。 因此,在执行功能的情况下,修改将在适当的地方进行,而在命令行上,它会产生更改时复制的效果。 Hadley的pryr软件包具有一些不错的功能,可以跟踪内存的引用和地址。

trans by 2020-07-10T05:08:56Z

时间序列-R data.table滑动风

用data.table包实现滑动窗口功能的最佳(最快)方法是什么?

我正在尝试计算滚动中位数,但每个日期有多个行(由于2个其他因素),我认为这意味着Zoo rollapply函数将无法正常工作。 这是使用朴素的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 nrow(output):1) {
  print(i)
  output[i, window_median:=median(get_window(date, factor1, factor2))]
}
trans by 2020-07-02T08:46:25Z

选择data.table R中的列子集

这个问题已经在这里有了答案:

  • 在data.table中选择列的子集 4个答案

我有一个带有一列列的数据表,例如:

dt<-data.table(matrix(runif(10*10),10,10))

我想对数据表执行一些操作,例如生成相关矩阵(cor(dt))。 为此,我想删除一些包含非数字值或超出一定范围的值的列。

假设我想找到不包括V1,V2,V3和V5的相关矩阵。

这是我目前的方法:

cols<-!(colnames(dt)=="V1" | colnames(dt)=="V2" | colnames(dt)=="V3" | colnames(dt)=="V5")
new_dt<-subset(dt,,cols)
cor(new_dt)

考虑到data.table语法通常如此优雅,我觉得这很麻烦。 有更好的方法吗?

trans by 2020-07-01T02:34:15Z

r-如何更改data.tab中因子列的级别

更改data.tablefactor列的级别的正确方法是什么(注意:不是数据帧)

  library(data.table)
  mydt <- data.table(id=1:6, value=as.factor(c("A", "A", "B", "B", "B", "C")), key="id")

  mydt[, levels(value)]
  [1] "A" "B" "C"

我正在寻找类似的东西:

mydt[, levels(value) <- c("X", "Y", "Z")]

但是,当然,以上行不起作用。

    # Actual               # Expected result
    > mydt                  > mydt
       id value                id value
    1:  1     A             1:  1     X
    2:  2     A             2:  2     X
    3:  3     B             3:  3     Y
    4:  4     B             4:  4     Y
    5:  5     B             5:  5     Y
    6:  6     C             6:  6     Z
trans by 2020-06-27T22:55:51Z

r-可以打印100多行数据表吗?

data.table有一个很好的功能,可以抑制输出到表的头和尾。

是否可以一次查看/打印100行以上?

library(data.table)
## Convert the ubiquitous "iris" data to a data.table
dtIris = as.data.table(iris)
## Printing 100 rows is possible
dtIris[1:100, ]
## Printing 101 rows is truncated
dtIris[1:101, ]

我经常有一些我只想查看的data.table结果有些大(例如200行)。

trans by 2020-06-27T11:27:42Z

如何基于子字符串匹配选择R data.table行(类似于SQL)

我有一个带字符列的data.table,并且只想选择其中包含子字符串的那些行。 等效于SQL WHERE x LIKE '%substring%'

例如。

> Months = data.table(Name = month.name, Number = 1:12)
> Months["mb" %in% Name]
Empty data.table (0 rows) of 2 cols: Name,Number

如何只选择名称包含“ mb”的行?

trans by 2020-06-21T20:25:03Z

utf 8-在R中将字符向量编码从“未知”编码为“ UTF-8”

我在R中的字符向量编码不一致时遇到问题。

我从中读取表格的文本文件在key中编码(通过colbycol::cbc.read.table)(我也尝试使用UTF-8 without BOM。)。

我想从此文本文件中读取表格,将其转换为colbycol::cbc.read.table,设置key并使用二进制搜索。 当我尝试这样做时,出现以下内容:

警告信息: 在colbycol::cbc.read.table(poli.dt,“żżonymi”,mult =“ first”): 在联接列中检测到已知编码(latin1或UTF-8)。 data.table当前比较字节,因此不支持 混合编码很好; 即同时使用latin1和UTF-8,或者如果有任何未知的编码为非ascii,并且其中一些标记为已知,并且 其他人没有。 但是,如果仅使用latin1或UTF-8,则所有 未知编码为ascii,则结果应该可以。 在未来 如果一切正常,我们将为您检查并避免出现此警告。 的 棘手的部分是这样做,而不会影响仅ASCII的性能 案件。

和二进制搜索不起作用。

我意识到我的colbycol::cbc.read.table-key列包含“未知”和“ UTF-8”两种编码类型:

> table(Encoding(poli.dt$word))
unknown   UTF-8 
2061312 2739122 

我尝试使用以下方法转换此列(在创建colbycol::cbc.read.table对象之前):

  • colbycol::cbc.read.table
  • colbycol::cbc.read.table

但没有效果。

我还尝试了几种将文件读入R的方法(设置所有有用的参数,例如colbycol::cbc.read.table):

  • colbycol::cbc.read.table
  • colbycol::cbc.read.table
  • colbycol::cbc.read.table
  • colbycol::cbc.read.table

但没有效果。

==================================================

我的R.version:

> R.version
           _                           
platform       x86_64-w64-mingw32          
arch           x86_64                      
os             mingw32                     
system         x86_64, mingw32             
status                                     
major          3                           
minor          0.3                         
year           2014                        
month          03                          
day            06                          
svn rev        65126                       
language       R                           
version.string R version 3.0.3 (2014-03-06)
nickname       Warm Puppy  

我的会话信息:

> sessionInfo()
R version 3.0.3 (2014-03-06)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=Polish_Poland.1250  LC_CTYPE=Polish_Poland.1250                LC_MONETARY=Polish_Poland.1250
[4] LC_NUMERIC=C                   LC_TIME=Polish_Poland.1250    

base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] data.table_1.9.2 colbycol_0.8     filehash_2.2-2   rJava_0.9-6     

loaded via a namespace (and not attached):
[1] plyr_1.8.1     Rcpp_0.11.1    reshape2_1.2.2 stringr_0.6.2  tools_3.0.3   
trans by 2020-06-21T02:19:39Z

如何在R中的data.table中使用变量的列名完全通用

首先:感谢@MattDowle; data.table是最好的东西之一自从我开始使用lapply(.SD,...), ... .SDcols = ...以来,我从未经历过。

第二:我知道可变列的各种用例的许多解决方法data.table中的名称,包括:

  1. 选择/分配给data.table变量,将其名称存储在字符向量中
  2. 使用R中的变量在data.table中传递列名
  3. 通过保存在变量中的名称引用data.table列
  4. 以编程方式将列名传递给data.table
  5. 数据表元编程
  6. 如何编写调用调用data.table的函数的函数?
  7. 在data.table中使用动态列名
  8. R.data.table中的动态列名称
  9. 按组在data.table中使用:=分配多列
  10. 使用data.table在“分组依据”操作中设置列名称
  11. R用data.table汇总多列

可能还有更多我没有提到的内容。

但是:即使我了解了上面记录的所有技巧,以至于我从未需要查找它们来提醒自己如何使用它们,我仍然会发现使用作为参数传递给函数的列名的方法是一项非常繁琐的任务。

我正在寻找的是“最佳实践批准”的替代方案以下解决方法/工作流程。 考虑我有一堆相似数据的列,并且想对这些列或它们的集合执行一系列相似的操作,其中这些操作的复杂度非常高,并且将列名的组传递给 一个变量。

我意识到这个问题听上去是人为的,但是我以惊人的频率碰到它。 这些示例通常都很混乱,很难分离出与该问题相关的功能,但我最近偶然发现了一个可以很容易地简化为MWE的功能:

library(data.table)
library(lubridate)
library(zoo)

the.table <- data.table(year=1991:1996,var1=floor(runif(6,400,1400)))
the.table[,`:=`(var2=var1/floor(runif(6,2,5)),
                var3=var1/floor(runif(6,2,5)))]

# Replicate data across months
new.table <- the.table[, list(asofdate=seq(from=ymd((year)*10^4+101),
                                           length.out=12,
                                           by="1 month")),by=year]

# Do a complicated procedure to each variable in some group.
var.names <- c("var1","var2","var3")

for(varname in var.names) {
    #As suggested in an answer to Link 3 above
    #Convert the column name to a 'quote' object
    quote.convert <- function(x) eval(parse(text=paste0('quote(',x,')')))

    #Do this for every column name I'll need
    varname <- quote.convert(varname)
    anntot <- quote.convert(paste0(varname,".annual.total"))
    monthly <- quote.convert(paste0(varname,".monthly"))
    rolling <- quote.convert(paste0(varname,".rolling"))
    scaled <- quote.convert(paste0(varname,".scaled"))

    #Perform the relevant tasks, using eval()
    #around every variable columnname I may want
    new.table[,eval(anntot):=
               the.table[,rep(eval(varname),each=12)]]
    new.table[,eval(monthly):=
               the.table[,rep(eval(varname)/12,each=12)]]
    new.table[,eval(rolling):=
               rollapply(eval(monthly),mean,width=12,
                         fill=c(head(eval(monthly),1),
                                tail(eval(monthly),1)))]
    new.table[,eval(scaled):=
               eval(anntot)/sum(eval(rolling))*eval(rolling),
              by=year]
}

当然,此处对数据和变量的特定影响无关紧要,因此,请不要着重于此或提出改进建议,以完成此特定情况下的工作。 我正在寻找的是一种通用的工作流程策略,该工作流程将data.table操作的任意复杂过程重复应用于变量列表中指定的列列表或列列表列表,或者作为参数传递给 函数,该过程必须以编程方式引用变量/自变量中命名的列,并且可能包括更新,联接,分组,对lapply(.SD,...), ... .SDcols = ...特殊对象eval(a.column.name)DT[[a.column.name]]的调用等。 但是比上述一种或多种需要频繁的data.table-ing和eval-ing的设计更简单,更优雅,更短或更易于设计,实施或理解的一种。

特别要注意的是,由于过程可能相当复杂,并且涉及到重复更新data.table,然后引用更新后的列,因此标准lapply(.SD,...), ... .SDcols = ...方法通常不是可行的替代方法。 同样,将eval(a.column.name)的每个调用替换为DT[[a.column.name]]不会简化太多,也不能完全正常地工作,因为据我所知,这与其他data.table操作不太兼容。

trans by 2020-06-20T18:35:48Z

r-如何从日期获取星期数?

寻找在R中的函数以将日期转换为(年)周号,我从包data.table中寻求了week。但是,我观察到一些奇怪的行为:

> week("2014-03-16") # Sun, expecting 11
[1] 11
> week("2014-03-17") # Mon, expecting 12
[1] 11
> week("2014-03-18") # Tue, expecting 12
[1] 12

为什么星期几在星期二而不是星期一切换为12? 我想念什么? (时区应该无关紧要,因为只有日期?!)

对于(基本)R函数的其他建议也将受到赞赏。

trans by 2020-06-17T21:08:34Z

r-如何从data.table中排除一列或如何将data.table转换为MT

使用df = as.data.frame(dt)时是否可以像zoo一样返回除一列以外的所有列?

如果答案是否定的,那么是否有人能以优雅的方式将多个时间序列df = as.data.frame(dt)转换为zoo或其他时间序列对象?

考虑以下示例:

library(data.table)
library(zoo)

## DEFINE DATA
set.seed(1)
dt = data.table(
    mydates = as.Date("2012-01-01") + 1:9, 
    value1 = sort(rpois(9, 6)),
    value2 = sort(rpois(9, 6)),
    value3 = sort(rpois(9, 6)),
    value4 = sort(rpois(9, 6)),
    value5 = sort(rpois(9, 6)))

## CONVERT TO DATA FRAME
df = as.data.frame(dt)

## CONVERT TO ZOO
zooObj = zoo(df[,-1], df$mydates)

## EXAMPLE OF DESIRED RESULTS
plot(zooObj, col=1:ncol(zooObj))

没有df = as.data.frame(dt)怎么办?

trans by 2020-02-17T16:23:36Z

r-如何执行data.table合并操作

注意:这个问题和以下答案是指data.table版本<1.5.3; 1.5.3版于2011年2月发布,以解决此问题。 查看更多近期处理(03-2012):将外键上的SQL联接转换为R data.table语法


我一直在仔细阅读data.table软件包的文档(替代data.frame,对于某些操作而言效率更高),包括Josh Reich在NYC R Meetup(pdf)上有关SQL和data.table的演示,但是 无法弄清楚这种完全琐碎的操作。

> x <- DT(a=1:3, b=2:4, key='a')
> x
     a b
[1,] 1 2
[2,] 2 3
[3,] 3 4
> y <- DT(a=1:3, c=c('a','b','c'), key='a')
> y
     a c
[1,] 1 a
[2,] 2 b
[3,] 3 c
> x[y]
     a b
[1,] 1 2
[2,] 2 3
[3,] 3 4
> merge(x,y)
  a b c
1 1 2 a
2 2 3 b
3 3 4 c

文档说:“ [[第一个参数]本身是data.table时,将类似于base :: merge调用联接,但对已排序的键使用二进制搜索。” 显然并非如此。 我可以使用data.tables将y中的其他列获取到x [y]的结果中吗? 似乎只是将x的行与键与y的键匹配,而完全忽略了y的其余部分...

trans by 2020-02-14T08:35:59Z

r-通过data.tab中的by连接继承的作用域

我在data.table 1.9.3上,也许我错了,但我不记得以下是之前预期的。

我建立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 = c(NA,
-3L), class = c("data.table", "data.frame"), .internal.selfref =
<pointer: 0x0000000000110788>, sorted = "idx")

> dput(x = dtb)
structure(list(idx = c(1, 4), valb = c(3, 6)), .Names = c("idx",
"valb"), row.names = c(NA, -2L), class = c("data.table", "data.frame"
), .internal.selfref = <pointer: 0x0000000000110788>, sorted = "idx")

在这两种情况下,密钥都是idx。

当然,以下作品

> dta[dtb, sum(valb)]
[1] 9

但是,这不是

> dta[dtb, sum(valb), by = fdx]
Error in `[.data.table`(dta, dtb, sum(valb), by = fdx) :
  object 'valb' not found

但这确实

> dta[dtb][, sum(valb), by = fdx]
   fdx V1
1:   a  3
2:  NA  6

如果我们看到中间步骤

> dta[dtb]
   idx vala fdx valb
1:   1    2   a    3
2:   4   NA  NA    6

我本来期望

dta[dtb, sum(valb), by = fdx] == dta[dtb][, sum(valb), by = fdx]

我哪里出问题了?

trans by 2020-02-10T11:24:02Z

r-适用于大型data.tab的write.csv

我有一个不是很大的(2 GB)data.table,但是由于某种原因data.frame花费了很长的时间才能将其写出(我从未真正完成等待),并且似乎要使用大量的RAM来完成它。

我尝试将data.table转换为data.frame,尽管自data.table扩展了data.frame以来,这实际上不应该做任何事情。

更重要的是,如果您使用Ctrl-C停止它,R似乎不会退还内存。

trans by 2020-02-08T13:16:26Z

r-按升序/降序对data.table快速排序

我有一个约300万行40列的data.table。 我想按以下sql模拟代码之类的组内的降序对表进行排序:

sort by ascending Year, ascending MemberID, descending Month 

在data.table中有等效的方法吗? 到目前为止,我必须将其分为两个步骤:

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()然后order(-Month)

   user  system elapsed 
816.144   9.648 848.798 

我现在的问题是:如果我想按排序后的年,会员编号和月(年,会员编号,月)进行汇总,data.table是否可以识别排序顺序?

更新2:回应Matthew Dowle:

用Year,MemberID和Month设置setkey之后,我仍然每个组有多个记录。 我想对每个小组进行总结。 我的意思是:如果我使用X [order(Year,MemberID,Month)],求和是否使用data.table的二进制搜索功能:

monthly.X <- X[, lapply(.SD[], sum), by = list(Year, MemberID, Month)]

更新3:Matthew D提出了几种方法。 第一种方法的运行时间比order()方法快:

   user  system elapsed 
  7.910   7.750  53.916 

马修:大部分时间使我感到惊讶的是,转换月份的符号。 没有它,setkey将会迅速发展。

trans by 2020-02-06T05:38:51Z

r-使用data.tab按组分组

假设我有一个包含一些棒球选手的数据表:

library(plyr)
library(data.table)

bdt <- as.data.table(baseball)

对于每个玩家(按ID给出),我想找到与他们玩游戏最多的年份相对应的行。 这在plyr中很简单:

ddply(baseball, "id", subset, g == max(g))

data.table的等效代码是什么?

我试过了:

setkey(bdt, "id") 
bdt[g == max(g)]  # only one row
bdt[g == max(g), by = id]  # Error: 'by' or 'keyby' is supplied but not j
bdt[, .SD[g == max(g)]] # only one row

这有效:

bdt[, .SD[g == max(g)], by = id] 

但这仅比plyr快30%,这表明它可能不是惯用语言。

trans by 2020-01-29T04:04:00Z

r-使用data.tab汇总多列

我正在尝试使用data.table来加速处理由几个较小的合并data.frames组成的大data.frame(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]

我真的不想手动输入所有50列计算,并且eval(paste(...))似乎有点笨拙。

我看了下面的示例,但是对于我的需求来说似乎有点复杂。 谢谢

如何汇总多个列中的data.table

trans by 2020-01-17T15:05:57Z

1 2 3 下一页 共3页