小编Bro*_*ieG的帖子

data.table vs dplyr:一个人能做得好吗,另一个做不好或做得不好?

概观

我比较熟悉data.table,而不是那么熟悉dplyr.我已经阅读了一些出现在SO上的dplyr小插曲和例子,到目前为止我的结论是:

  1. data.table并且dplyr在速度上具有可比性,除非有许多(即> 10-100K)组,并且在某些其他情况下(参见下面的基准)
  2. dplyr 有更多可访问的语法
  3. dplyr 摘要(或将)潜在的DB交互
  4. 有一些小的功能差异(参见下面的"示例/用法")

在我看来2.没有多大的重量,因为我对它很熟悉data.table,虽然我明白对于那些对这两者都不熟悉的用户来说这将是一个很重要的因素.我想避免争论哪个更直观,因为这与我从已经熟悉的人的角度提出的具体问题无关data.table.我还想避免讨论"更直观"如何导致更快的分析(当然是真的,但同样,不是我最感兴趣的).

我想知道的是:

  1. 对于熟悉软件包的人来说,是否需要使用一个或另一个软件包来编写分析任务更加容易(例如,需要按键的一些组合与所需的深奥水平相结合,其中每个项目的好处都是好事).
  2. 是否存在在一个包装与另一个包装中更有效地执行分析任务(即,超过2倍)的分析任务.

最近的一个问题让我更多地思考这个问题,因为直到那时我才认为dplyr会提供超出我已经做过的东西data.table.这是dplyr解决方案(Q末尾的数据):

dat %.%
  group_by(name, job) %.%
  filter(job != "Boss" | year == min(year)) %.%
  mutate(cumu_job2 = cumsum(job2))
Run Code Online (Sandbox Code Playgroud)

这比我的黑客尝试data.table解决方案要好得多.也就是说,好的data.table解决方案也相当不错(感谢Jean-Robert,Arun,并注意到这里我赞成对最严格的最佳解决方案的单一陈述):

setDT(dat)[,
  .SD[job != "Boss" | year == min(year)][, cumjob := cumsum(job2)], 
  by=list(id, job)
]
Run Code Online (Sandbox Code Playgroud)

后者的语法可能看起来非常深奥,但如果你习惯了data.table(即不使用一些更深奥的技巧),它实际上非常简单.

理想情况下,我希望看到的是一些很好的例子,dplyr …

r dplyr data.table

719
推荐指数
4
解决办法
11万
查看次数

必须R包卸载时卸载动态库吗?

来自哈德利的C最佳实践:

与C++一样,无论何时在包中使用C代码,都应该在卸载包时卸载DLL:

.onUnload <- function (libpath) {
  library.dynam.unload("mypackage", libpath)
}
Run Code Online (Sandbox Code Playgroud)

另一方面,写R扩展甚至没有提到这一点.我可以看到卸载dll是多么礼貌,但这样做似乎会导致一些奇怪的问题,包括加载/卸载/重新加载的包(参见下面的示例).此外,还有一些提及建议可能不需要卸货.来自?library.dynam:

请注意,是否可以卸载DLL然后重新加载同一文件的修订版本取决于操作系统:请参阅dyn.unload帮助的"值"部分.

虽然这不应该影响未修改的对象.然后是来自R-devel的Brian Ripley的评论:

说了这么多,我的经验是,如果你需要再次加载它,卸载DLL通常没有帮助(这就是为什么例如tcltk不卸载它的DLL).

那么加载C库是否可以接受?我宁愿不必深入研究为什么会发生以下情况(在我开始卸载库之前没有发生).

R version 3.1.1 (2014-07-10)
Platform: x86_64-apple-darwin13.1.0 (64-bit)

> library(alike)       # install_github("brodieg/alike", ref="fdaa578e"), if you're curious
> library(data.table)
data.table 1.9.2  For help type: help("data.table")
> detach("package:data.table", unload=T)
> detach("package:alike", unload=T)
> library(alike)
> library(data.table)
Error : .onLoad failed in loadNamespace() for 'data.table', details:
  call: address(x)
  error: object 'Caddress' not found
In addition: Warning messages:
1: In FUN(X[[9L]], …
Run Code Online (Sandbox Code Playgroud)

c dll packages r

46
推荐指数
1
解决办法
1686
查看次数

关于使用roxygen2的UTF-8的警告

我有一个关于UTF-8的问题.在执行roxygen2::roxygenise()我的包之后,它显示警告消息'roxygen2需要编码:UTF-8'.我该如何解决?

roxygen2::roxygenise()

>     Writing NAMESPACE
>     
>     Loading ABXTT
>     
>     Writing NAMESPACE
>     
>     Warning message:
>     
>     roxygen2 requires Encoding: UTF-8
Run Code Online (Sandbox Code Playgroud)

r utf-8 package roxygen2

42
推荐指数
2
解决办法
3442
查看次数

将函数列表应用于值列表

在参考这个问题时,我试图找出将函数列表应用于值列表的最简单方法.基本上是嵌套的lapply.例如,这里我们应用sdmean内置数据集trees:

funs <- list(sd=sd, mean=mean)
sapply(funs, function(x) sapply(trees, x))
Run Code Online (Sandbox Code Playgroud)

要得到:

              sd     mean
Girth   3.138139 13.24839
Height  6.371813 76.00000
Volume 16.437846 30.17097
Run Code Online (Sandbox Code Playgroud)

但我希望避免内心,function并有类似的东西:

sapply(funs, sapply, X=trees)
Run Code Online (Sandbox Code Playgroud)

哪个不起作用,因为X匹配第一个sapply而不是第二个.我们可以这样做functional::Curry:

sapply(funs, Curry(sapply, X=trees))
Run Code Online (Sandbox Code Playgroud)

但是我希望也许有一种聪明的方法可以通过我缺少的位置和名称匹配来做到这一点.

r apply

26
推荐指数
3
解决办法
5538
查看次数

gcc-10.0.1 特定的段错误

我有一个带有 C 编译代码的R 包,它在相当长一段时间内相对稳定,并且经常针对各种平台和编译器(windows/osx/debian/fedora gcc/clang)进行测试。

最近添加了一个新平台来再次测试包:

Logs from checks with gcc trunk aka 10.0.1 compiled from source
on Fedora 30. (For some archived packages, 10.0.0.)

x86_64 Fedora 30 Linux

FFLAGS="-g -O2 -mtune=native -Wall -fallow-argument-mismatch"
CFLAGS="-g -O2 -Wall -pedantic -mtune=native -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong -fstack-clash-protection -fcf-protection"
CXXFLAGS="-g -O2 -Wall -pedantic -mtune=native -Wno-ignored-attributes -Wno-deprecated-declarations -Wno-parentheses -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong -fstack-clash-protection -fcf-protection"
Run Code Online (Sandbox Code Playgroud)

此时,编译后的代码立即开始沿着这些行进行段错误:

 *** caught segfault ***
address 0x1d00000001, cause 'memory not mapped'
Run Code Online (Sandbox Code Playgroud)

通过使用具有优化级别的rocker/r-basedocker 容器,我已经能够一致地重现段错误。运行较低的优化可以解决问题。运行任何其他设置,包括在 valgrind(-O0 和 -O2)、UBSAN(gcc/clang)下,都没有显示任何问题。我也有理由确定这在 下运行,但没有数据。 …

c gcc segmentation-fault

25
推荐指数
1
解决办法
827
查看次数

是否有像expect_no_warnings()那样的测试?

我正在为一个函数编写测试,在某些条件下会产生警告.我想确保在其他条件下它不会产生警告.我没有看到一个明显的方法来轻松测试testthat.我想我可以这样做:

my.result <- 25
my.func <- function() my.result
expect_equal(
  withCallingHandlers(
    my.func(), warning=function() stop("A Warning!")
  ), 
  my.result
)
Run Code Online (Sandbox Code Playgroud)

或使用options(warn=2),但我希望有类似的东西:

expect_no_warnings(my.func())
Run Code Online (Sandbox Code Playgroud)

我错过了一些明显的东西吗

r testthat

22
推荐指数
2
解决办法
1457
查看次数

git在一个命令中添加和提交单个跟踪文件

我正在寻找相当于git commit -am "blah blah"但只有一个文件.如果我尝试:

git commit my.file -am "blah blah"
Run Code Online (Sandbox Code Playgroud)

我明白了:

fatal: Paths with -a does not make sense.
Run Code Online (Sandbox Code Playgroud)

我环顾四周,但我只能找到建议使用别名的解决方案(例如这个),但即使是那些似乎也不能修改,因为我需要传递一个参数.我是否必须通过shell调用git

似乎应该有一个更简单的选择,我认为这将是非常常见的.现在我坚持:

git add my.file
git commit -m "blah blah"
Run Code Online (Sandbox Code Playgroud)

git alias

17
推荐指数
1
解决办法
1万
查看次数

使用data.table作为参数在函数内使用deparse(substitute())

如果我想将函数的参数解析为错误或警告,如果参数转换为函数中的data.table,则会发生奇怪的事情:

e <- data.frame(x = 1:10)
### something strange is happening
foo <- function(u) {
  u <- data.table(u)
  warning(deparse(substitute(u)), " is not a data.table")
  u
}
foo(e)

##  foo(e)
##      x
##  1:  1
##  2:  2
##  3:  3
##  4:  4
##  5:  5
##  6:  6
##  7:  7
##  8:  8
##  9:  9
## 10: 10
## Warning message:
## In foo(e) :
##   structure(list(x = 1:10), .Names = "x", row.names = c(NA, -10L), class …
Run Code Online (Sandbox Code Playgroud)

r substitution data.table

13
推荐指数
1
解决办法
1304
查看次数

在Github上获取Travis Shield以反映选定的分支状态

现在,无论我在github项目页面中选择哪个分支,我都可以使用我的travis屏蔽来反映最新的运行或特定的分支.我可以通过在URL的末尾省略或指定分支名称来做到这一点.相反,我想获得与所选分支相对应的盾牌.换句话说,每次我选择不同的分支时,我README.md文件中travis shield的URL 都会改变.

在SVN中,您可以使用SVN关键字通过使用分支名称(或类似名称)修改屏蔽URL来实现某种类型的操作.此QA为git提供了一些替代方案,但是:

  • 我宁愿避免依赖shell脚本
  • 我不认为关键字扩展会起作用,因为我需要Github端的文件不同,而不是我的本地计算机(希望我对此错了)

有任何想法吗?希望我只是缺少一些愚蠢的东西.像这样的感觉必须有一个非常简单的方法来做到这一点.

git github travis-ci

10
推荐指数
1
解决办法
2506
查看次数

rbind`data.tables`并保存密钥

我正在寻找类似于插入已经键入的SQL表的行为,其中添加的新行被插入到现有键中.例如,在这种情况下:

dt <- data.table(a=1:10)
setkey(dt, a)
tables()
#      NAME NROW MB COLS KEY
# [1,] dt     10 1  a    a  
dt.2 <- rbindlist(list(dt, data.table(a=1:5)))
tables()
#      NAME NROW MB COLS KEY
# [1,] dt     10 1  a    a  
# [2,] dt.2   15 1  a      
Run Code Online (Sandbox Code Playgroud)

我希望可以选择dt.2"继承"密钥(显然是使用增量数据更新)dt,而不是实际发生的密钥.

起初我对丢失密钥感到有些惊讶,但这显然是记录在案的行为.

有没有一个干净的方式这样做,而不是setkey在每次rbind/ 后调用rbindlist

indexing r data.table

9
推荐指数
1
解决办法
953
查看次数