Tag: data.table

data.table vs dplyr:一个人可以做些什么,另一个不行或者做得不好?

概观 我对data.table比较熟悉,与data.table不太dplyr 。 我已经读过一些dplyr小插曲和例子,到目前为止,我的结论是: data.table和dplyr在速度上是可比较的,除非有很多(即> 10-100K)的组,在其他一些情况下(见下面的基准) dplyr有更多可访问的语法 dplyr抽象(或将)潜在的数据库交互 有一些次要的function差异(请参阅下面的“示例/用法”) 在我看来2.不会承受太多的重量,因为我对data.table相当熟悉,但我明白,对于新用户来说这将是一个很大的因素。 我想避免一个关于哪一个更直观的论点,因为从已经熟悉data.table的人的angular度来看,这与我提出的具体问题是无关的。 我也想避免讨论“更直观”如何导致更快的分析(当然,但是,不是我最感兴趣的是这里)。 题 我想知道的是: 是否有分析任务比熟悉软件包的人更容易使用一个或另一个软件包进行编码(即,所需的击键与所需的深奥级别的组合,其中每一个都是好事)。 是否有分析任务在一个包中比另一个更有效地执行(即超过2倍)。 最近的一个问题使我想到了这个问题 ,因为直到那时,我不认为dplyr会提供比dplyr更多的东西。 这里是dplyr解决scheme(数据在Q末尾): dat %.% group_by(name, job) %.% filter(job != "Boss" | year == min(year)) %.% mutate(cumu_job2 = cumsum(job2)) 这比我在data.table解决scheme上的尝试要好得多。 也就是说,良好的data.table解决scheme也是相当不错的(感谢Jean-Robert,Arun,并且在这里我注意到我偏爱最严格的最佳解决scheme): setDT(dat)[, .SD[job != "Boss" | year == min(year)][, cumjob := cumsum(job2)], by=list(id, job) ] 后者的语法可能看起来很深奥,但是如果你习惯data.table (即不使用一些更深奥的技巧),它实际上是非常简单的。 理想情况下,我想看到的是一些很好的例子, dplyr或data.table方式更加简洁或者performance更好。 […]

按组提取对应variables最小值的行

我希望(1)用一个variables( State )对数据进行分组,(2)在每个组内find另一个variables( Employees )的最小值的行,并且(3)提取整个行。 (1)和(2)是简单的一行,我觉得(3)也应该是,但我不明白。 这是一个示例数据集: > data State Company Employees 1 AK A 82 2 AK B 104 3 AK C 37 4 AK D 24 5 RI E 19 6 RI F 118 7 RI G 88 8 RI H 42 data <- structure(list(State = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, […]

如何将相同的函数应用于data.table中的每个指定列

我有一个data.table,我想在某些列上执行相同的操作。 这些列的名称是在一个字符向量中给出的。 在这个特殊的例子中,我想把所有这些列乘以-1。 一些玩具数据和一个向量指定相关的列: library(data.table) dt <- data.table(a = 1:3, b = 1:3, d = 1:3) cols <- c("a", "b") 现在我正在这样做,遍历字符向量: for (col in 1:length(cols)) { dt[ , eval(parse(text = paste0(cols[col], ":=-1*", cols[col])))] } 有没有办法做到这一点,没有for循环?

为什么data.table通过引用更新名称(DT),即使我分配给另一个variables?

我已经将data.table的名称存储为一个vector : library(data.table) set.seed(42) DT <- data.table(x = runif(100), y = runif(100)) names1 <- names(DT) 据我所知,这是一个普通的香草字符vector: str(names1) # chr [1:2] "x" "y" class(names1) # [1] "character" dput(names1) # c("x", "y") 但是,这不是普通的字符向量。 这是一个魔法字符vector! 当我添加一个新的列到我的data.table ,这个向量得到更新! DT[ , z := runif(100)] names1 # [1] "x" "y" "z" 我知道这与如何处理:=通过赋值更新有关,但是对于我来说,这仍然看起来很神奇,因为我期望<-将data.table的名称复制一份 。 我可以通过在c()包装名称来解决这个问题: library(data.table) set.seed(42) DT <- data.table(x = runif(100), […]

用最新的非NA值replaceNA

在data.frame(或data.table)中,我想“填充”具有最近的非NA值的NA。 一个简单的例子,使用vector(而不是data.frame )如下: > y <- c(NA, 2, 2, NA, NA, 3, NA, 4, NA, NA) 我想要一个函数fill.NAs() ,它允许我构造yy ,使得: > yy [1] NA NA NA 2 2 2 2 3 3 3 4 4 我需要对许多(总计data.frame )小型数据data.frame ( data.frame )重复这个操作,其中一行是NA,它的所有条目都是。 什么是解决问题的好方法? 我制作的丑陋解决scheme使用这个function: last <- function (x){ x[length(x)] } fill.NAs <- function(isNA){ if (isNA[1] == 1) { […]

用开始/结束窗口滚动连接

考虑下面的data.table 。 第一个定义了一组具有开始和结束位置的区域 library(data.table) d1 <- data.table(x=letters[1:5], start=c(1,5,19,30, 7), end=c(3,11,22,39,25)) setkey(d1, x,start) # x start end # 1: a 1 3 # 2: b 5 11 # 3: c 19 22 # 4: d 30 39 # 5: e 7 25 第二个代表每个组的观察结果 d2 <- data.table(x=letters[c(1,1,2,2,3:5)], pos=c(2,3,3,12,20,52,10)) setkey(d2, x,pos) # x pos # 1: a 2 […]

按data.table分组

假设我有一个包含一些棒球选手的数据表: library(plyr) library(data.table) bdt <- as.data.table(baseball) 对于每个玩家(由ID给出),我想find对应他们玩最多游戏年份的行。 这在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 […]

确切地了解data.table何时是另一个data.table的引用(vs另一个副本)

我在理解data.table的传递引用属性时遇到了一些麻烦。 一些操作似乎“打破”了参考,我想要明白到底发生了什么事情。 从另一个data.table创build一个data.table (通过<- ,然后更新新的表:= ,原来的表也被改变,这是预期的,按照: ?data.table::copy和stackoverflow:通过引用传入数据表中的操作符包 这是一个例子: library(data.table) DT <- data.table(a=c(1,2), b=c(11,12)) print(DT) # ab # [1,] 1 11 # [2,] 2 12 newDT <- DT # reference, not copy newDT[1, a := 100] # modify new DT print(DT) # DT is modified too. # ab # [1,] 100 11 # [2,] 2 12 […]

如何在每个组中创建一个滞后变量?

我有一个data.table: set.seed(1) data <- data.table(time = c(1:3, 1:4), groups = c(rep(c("b", "a"), c(3, 4))), value = rnorm(7)) data # groups time value # 1: b 1 -0.6264538 # 2: b 2 0.1836433 # 3: b 3 -0.8356286 # 4: a 1 1.5952808 # 5: a 2 0.3295078 # 6: a 3 -0.8204684 # 7: a […]