小编use*_*086的帖子

data.table根据条件更新组中的最后一个元素

我有一个包含3列的data.table:id,time和status.对于每个id,我想找到具有最大时间的记录 - 如果对于该记录,状态为true,我想在时间> 7(例如)时将其设置为false.我是按照以下方式进行的.

x <- data.table(id=c(1,1,2,2),time=c(5,6,7,8),status=c(FALSE,TRUE,FALSE,TRUE))
setkey(x,id,time)
y <- x[,.SD[.N],by=id]
x[y,status:=status & time > 7]
Run Code Online (Sandbox Code Playgroud)

我有很多我正在使用的数据,并希望加快这项操作.任何建议,将不胜感激!

r data.table

7
推荐指数
3
解决办法
602
查看次数

从备份和恢复 R 会话中停止 R 包构建和重新加载

我正在 Windows 10 上的 Rstudio 中编写 R 包。每次我重新加载包时,都会出现一条注释:“备份 R 会话”,然后是“恢复 R 会话”。这需要一些时间(在 14 秒的总包构建时间中大约需要 8 或 9 秒),如果可以更快一点就好了。当我重新加载包时,我大部分时间都没有备份 R 会话,而是从一个干净的会话开始。

有什么办法可以阻止 R 备份会话或恢复旧会话?即使我rm(list=ls())在单击“构建和重新加载”之前运行,似乎仍然需要一些时间来完成该过程。

r rstudio r-package

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

自定义rcpp last函数与dplyr group_by比较慢,并且与tapply相比汇总

我正在尝试了解如何编写Rcpp摘要函数,这些函数可以通过dplyr快速实现。这样做的动机是dplyr似乎没有等效的函数,但是为了简单起见,我将使用仅取向量的最后一个元素的示例。

在下面的代码中,我考虑了三个不同的函数来获取向量的最后一个元素,并同时使用tapply和dplyr group_by / summarise来应用它们。

library(dplyr)
library(microbenchmark)
library(Rcpp)
n <- 5000
df <- data.frame(grp = factor(rep(1:n, 2)), valn = rnorm(2L*n), stringsAsFactors = F)

dplyr_num_last_element <- function() df %>% group_by(grp) %>% summarise(valn = last(valn))
dplyr_num_last_element_r <- function() df %>% group_by(grp) %>% summarise(valn = last_r(valn))
dplyr_num_last_element_rcpp <- function() df %>% group_by(grp) %>% summarise(val = last_rcpp(valn))
tapply_num_last_element <- function() tapply(df$valn, df$grp, FUN = last)
tapply_num_last_element_r <- function() tapply(df$valn, df$grp, FUN = last_r)
tapply_num_last_element_rcpp <- function() tapply(df$valn, df$grp, FUN = last_rcpp)

last_r <- function(x) …
Run Code Online (Sandbox Code Playgroud)

performance r tapply dplyr

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

根据两个data.tables的where子句同时加入和更新

我正在尝试使用data.table包来更新data.table,y具体取决于与列y相关的列的位置x,其中两个数据帧可以通过id映射在一起.

考虑以下两个data.tables:

x <- data.table(id=c(1,2,3),status=c(0,1,1),xend=c(2,4,7))
y <- data.table(id=c(1,1,2,2,3,3),yend=c(2,2,3,5,6,8))
setkey(x,id)
setkey(y,id)
Run Code Online (Sandbox Code Playgroud)

现在y我想要更新列yend,status == 1 and yend > xend这样yend就变成了xend.当然以下表示法不执行操作,因为我将data.table与表达式混合,但我认为这将有助于显示我想要做的事情.

y[x[status==1] & yend>xend,yend:=xend]
Run Code Online (Sandbox Code Playgroud)

最简单的方法是什么?

r data.table

4
推荐指数
1
解决办法
191
查看次数

R功能中的Magrittr管

从(1)速度和(2)有效调试的能力的角度来看,在某些情况下在R函数内部使用magrittr管道是否不利?

pipeline r magrittr

4
推荐指数
1
解决办法
766
查看次数

规范化变量data.table

我希望通过减去每个组中的平均值来规范化data.table中的变量.我是按照以下方式完成的:

dx <- data.table(x=c(1,3,5,1,8,11),group=factor(c(1,1,1,2,2,2)))
dy <- dx[,.(xmean=mean(x)),by=.(group)]
setkey(dx,group)
setkey(dy,group)
dx[dy,x_norm:=x-xmean]
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更简洁的方法来做到这一点?

r data.table

2
推荐指数
1
解决办法
1593
查看次数

标签 统计

r ×6

data.table ×3

dplyr ×1

magrittr ×1

performance ×1

pipeline ×1

r-package ×1

rstudio ×1

tapply ×1