Tag: data.table

按组获得最高值

这是一个示例数据框架: d <- data.frame( x = runif(90), grp = gl(3, 30) ) 我想要d的子集,包含每个值为grp的前5个值为x的行。 使用base-R,我的方法是这样的: ordered <- d[order(d$x, decreasing = TRUE), ] splits <- split(ordered, ordered$grp) heads <- lapply(splits, head) do.call(rbind, heads) ## x grp ## 1.19 0.8879631 1 ## 1.4 0.8844818 1 ## 1.12 0.8596197 1 ## 1.26 0.8481809 1 ## 1.18 0.8461516 1 ## […]

通过数字索引在data.table中select多个列

我们如何使用data.table中的数字索引(位置)向量来select多列? 这是我们如何处理data.frame : df <- data.frame(a = 1, b = 2, c = 3) df[ , 2:3] # bc # 1 2 3

使用:=在data.table中,按组分组多个列

使用data.table分配给多个列的最佳方式是什么? 例如: f <- function(x) {c("hi", "hello")} x <- data.table(id = 1:10) 我想要做这样的事情(当然这个语法是不正确的): x[ , (col1, col2) := f(), by = "id] 并扩大,我可能有很多名称在variables列(如column_names ),我想这样做: x[ , col_names := another_f(), by = "id", with = FALSE] 什么是正确的方式来做这样的事情?

正确/最快的方法来重塑data.table

我有一个数据表在R: library(data.table) set.seed(1234) DT <- data.table(x=rep(c(1,2,3),each=4), y=c("A","B"), v=sample(1:100,12)) DT xyv [1,] 1 A 12 [2,] 1 B 62 [3,] 1 A 60 [4,] 1 B 61 [5,] 2 A 83 [6,] 2 B 97 [7,] 2 A 1 [8,] 2 B 22 [9,] 3 A 99 [10,] 3 B 47 [11,] 3 A 63 [12,] […]

Data.table元编程

我认为元编程在这里是合适的。 我希望能够使用data.table,就像在一个web应用程序中使用MySQL一样。 也就是说,Web用户使用一些Web前端(例如Shiny服务器)来select数据库,select要过滤的列,select要分组的列,select要聚合的列和聚合函数。 我想使用R和data.table作为查询,聚合等的后端。假设前端存在,并且R将这些variables作为string进行validation等。 我编写了以下函数来构builddata.tableexpression式,并使用R的parse / eval元编程function来运行它。 这是一个合理的方式来做到这一点? 我包括所有相关的代码来testing这个。 源代码(读取安全性后)并运行test_agg_meta()来testing它。 这只是一个开始。 我可以添加更多的function。 但是我的主要问题是我是否过分地考虑这个问题。 当所有的input都是未定的时候,是否有一个更直接的方式来使用data.table,而不使用parsing/评估元编程? 我也知道“有”的说法和其他无糖function的方法,但不知道是否可以照顾所有情况。 require(data.table) fake_data<-function(num=12){ #make some fake data x=1:num lets=letters[1:num] data=data.table( u=rep(c("A","B","C"),floor(num/3)), v=x %%2, w=lets, x=x, y=x^2, z=1-x) return(data) } data_table_meta<-function( #aggregate a data.table meta-programmatically data_in=fake_data(), filter_cols=NULL, filter_min=NULL, filter_max=NULL, groupby_cols=NULL, agg_cols=setdiff(names(data_in),groupby_cols), agg_funcs=NULL, verbose=F, validate=T, jsep="_" ){ all_cols=names(data_in) if (validate) { stopifnot(length(filter_cols) == […]

.EACHI在data.table中

我似乎无法find任何有关.EACHI在data.table中data.table任何文档。 我在文档中看到了一个简短的提及: 对于已知组的一个子集的聚合在通过i中的这些组并by=.EACHI设置时是特别有效的。 当i是一个data.table时, DT[i,j,by=.EACHI]对j中的每一行join的DT组进行求值。 我们把这个分组称为每个我。 但是,在DT的背景下,“群体”是什么意思呢? 是由DT上设置的密钥确定的组? 组中的每一个不同的行使用所有的列作为关键? 我完全理解如何运行类似DT[i,j,by=my_grouping_variable]但对于.EACHI如何工作会感到困惑。 有人可以解释吗?

按多列进行分组并合计其他多列

我有一个约200列的数据框,其中我想表前十组左右,这是因素和总结其余的列。 我列出了所有想要分组的列名以及我想要聚合的所有列的列表。 我正在寻找的输出格式需要是具有相同col数的相同dataframe,只是分组在一起。 有使用包data.table , plyr或其他的解决scheme吗?

在我自己的包中使用data.table包

我正在尝试在我自己的包中使用data.table包。 MWE如下: 我创build一个函数test.fun,它只是创build一个小的data.table对象,然后用“A”列对“Val”列进行求和。 代码是 test.fun<-function () { library(data.table) testdata<-data.table(A=rep(seq(1,5), 5), Val=rnorm(25)) setkey(testdata, A) res<-testdata[,{list(Ct=length(Val),Total=sum(Val),Avg=mean(Val))},"A"] return(res) } 当我在常规R会话中创build此函数,然后运行该函数时,它按预期工作。 > res<-test.fun() data.table 1.8.0 For help type: help("data.table") > res A Ct Total Avg [1,] 1 5 -0.5326444 -0.1065289 [2,] 2 5 -4.0832062 -0.8166412 [3,] 3 5 0.9458251 0.1891650 [4,] 4 5 2.0474791 0.4094958 [5,] 5 5 2.3609443 […]

在data.table中设置密钥的目的是什么?

我正在使用data.table,有许多function需要我设置一个键(例如X[Y] )。 因此,我希望了解一个密钥在我的数据表中正确设置密钥的function。 我读的一个来源是?setkey 。 setkey()对data.table进行sorting并将其标记为已sorting。 sorting的列是关键。 密钥可以是任何顺序的任何列。 列总是按升序排列。 该表通过引用进行更改。 除了一列之外的临时工作记忆,完全没有拷贝。 这里我的外卖是一个关键将“sorting”data.table,导致与order()非常相似的效果。 但是,这并没有解释拥有钥匙的目的。 data.table FAQ 3.2和3.3解释: 3.2我在大桌子上没有钥匙,但分组依然很快。 这是为什么? data.table使用基数sorting。 这比其他sortingalgorithm显着快。 基数只针对整数,参见?base::sort.list(x,method="radix") 。 这也是为什么setkey()很快的原因之一。 当没有密钥设置,或者我们按照与密钥不同的顺序进行分组时,我们称它为特设。 3.3为什么密钥中的列按分组速度快于临时密钥? 由于每个组在RAM中是连续的,因此可以最小化页面抓取,并且可以批量复制内存(C中的memcpy ),而不是在C中循环。 从这里,我猜想设置一个关键点允许R使用“基数sorting”优于其他algorithm,这就是为什么它更快。 10分钟快速入门指南还有一个关键指南。 按键 首先考虑data.frame,特别是rownames(或英文,行名)。 也就是说,属于单个行的多个名称。 属于单行的多个名字? 这不是我们习惯的data.frame。 我们知道每行至多有一个名字。 一个人至less有两个名字,一个名字和一个第二名字。 这对组织一个电话号码簿很有用,例如,按照姓氏sorting,然后名字sorting。 但是,data.frame中的每一行只能有一个名字。 一个键由一列或多列rownames组成,可以是整数,因子,字符或其他类,而不是简单的字符。 此外,行按键sorting。 因此,data.table最多只能有一个键,因为它不能以多种方式sorting。 唯一性不强制执行,即允许重复键值。 由于行按键sorting,因此键中的任何重复项都将连续出现 电话簿有助于理解一个关键是什么,但是与具有一个因子列相比,关键是没有什么不同。 而且,这并不能解释为什么需要一个密钥(特别是使用某些函数)以及如何select列来设置密钥。 另外,在一个data.table中,随着时间的推移,如果将其他列设置为key,也可能会混淆time列,这使得它更加令人困惑,因为我不知道是否允许将其他列设置为键。 有人能够赐教吗?

如何在data.table中通过引用删除一行?

我的问题是关于分配参考与data.table复制。 我想知道是否可以通过引用删除行,类似于 DT[ , someCol := NULL] 我想知道 DT[someRow := NULL, ] 我想为什么这个函数不存在是有很好的理由的,所以也许你可以指出一个很好的替代方法,如下所示。 特别是,从我的例子(data.table)最喜欢的, DT = data.table(x = rep(c("a", "b", "c"), each = 3), y = c(1, 3, 6), v = 1:9) # xyv # [1,] a 1 1 # [2,] a 3 2 # [3,] a 6 3 # [4,] b 1 4 # […]