我有一个包含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)
我有很多我正在使用的数据,并希望加快这项操作.任何建议,将不胜感激!
我正在 Windows 10 上的 Rstudio 中编写 R 包。每次我重新加载包时,都会出现一条注释:“备份 R 会话”,然后是“恢复 R 会话”。这需要一些时间(在 14 秒的总包构建时间中大约需要 8 或 9 秒),如果可以更快一点就好了。当我重新加载包时,我大部分时间都没有备份 R 会话,而是从一个干净的会话开始。
有什么办法可以阻止 R 备份会话或恢复旧会话?即使我rm(list=ls())在单击“构建和重新加载”之前运行,似乎仍然需要一些时间来完成该过程。
我正在尝试了解如何编写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) 我正在尝试使用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)
最简单的方法是什么?
从(1)速度和(2)有效调试的能力的角度来看,在某些情况下在R函数内部使用magrittr管道是否不利?
我希望通过减去每个组中的平均值来规范化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 ×6
data.table ×3
dplyr ×1
magrittr ×1
performance ×1
pipeline ×1
r-package ×1
rstudio ×1
tapply ×1