小编had*_*ley的帖子

我在哪里可以学习如何编写C代码来加速慢速R函数?

学习如何编写用于R的C代码的最佳资源是什么?我知道R扩展的系统和外语接口部分,但我发现它很难.编写用于R的C代码有哪些好的资源(在线和离线)?

为了澄清,我不想学习如何编写C代码,我想学习如何更好地集成R和C.例如,我如何从C整数向量转换为R整数向量(反之亦然)或者从C标量到R向量?

r rcpp

111
推荐指数
4
解决办法
9050
查看次数

使用data.table按组进行子集化

假设我有一个包含一些棒球运动员的数据表:

library(plyr)
library(data.table)

bdt <- as.data.table(baseball)
Run Code Online (Sandbox Code Playgroud)

对于每个玩家(由id给出),我想找到与他们玩最多游戏的年份相对应的行.这在plyr中很简单:

ddply(baseball, "id", subset, g == max(g))
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

这有效:

bdt[, .SD[g == max(g)], by = id] 
Run Code Online (Sandbox Code Playgroud)

但它比plyr快30%,这表明它可能不是惯用语.

r greatest-n-per-group data.table

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

使用data.table执行半连接

如何使用data.table 执行半连接?半连接类似于内部连接,除了它只返回X的列(不是Y的列),并且不重复X的行以匹配Y的行.例如,以下代码执行内部连接加入:

x <- data.table(x = 1:2, y = c("a", "b"))
setkey(x, x)
y <- data.table(x = c(1, 1), z = 10:11)

x[y]
#   x y  z
# 1: 1 a 10
# 2: 1 a 11
Run Code Online (Sandbox Code Playgroud)

半连接只会返回 x[1]

r semi-join data.table

36
推荐指数
3
解决办法
4302
查看次数

防止R中的性能回归

检测R包中的性能回归有什么好的工作流程?理想情况下,R CMD check当我在代码中引入显着的性能回归时,我正在寻找可以集成的东西.

一般来说什么是好的工作流程?还有哪些其他语言提供的好工具 它是可以建立在最高单元测试上的,还是通常单独完成的?

testing performance r

32
推荐指数
2
解决办法
1000
查看次数

哪些包很好地利用了S4对象?

哪些R包可以很好地利用S4类?我正在寻找适当使用S4的软件包(即当底层问题的复杂性需要时),编写得很好并且记录良好(这样你就可以阅读代码并了解正在发生的事情).

我很感兴趣,因为我很快就会教S4,我想让学生在实践中找到很好的例子,这样他们就可以阅读代码来帮助他们学习.

r s4

24
推荐指数
2
解决办法
2030
查看次数

为什么替换函数的参数不会被懒惰地评估?

考虑以下简单功能:

f <- function(x, value){print(x);print(substitute(value))}
Run Code Online (Sandbox Code Playgroud)

争论x最终会被评估print,但value绝不会.所以我们可以得到这样的结果:

> f(a, a)  
Error in print(x) : object 'a' not found  
> f(3, a)  
[1] 3  
a  
> f(1+1, 1+1)  
[1] 2  
1 + 1  
> f(1+1, 1+"one")  
[1] 2  
1 + "one"
Run Code Online (Sandbox Code Playgroud)

一切都如预期的那样.

现在考虑替换函数中的相同函数体:

'g<-' <- function(x, value){print(x);print(substitute(value))}
Run Code Online (Sandbox Code Playgroud)

(单引号应该是花哨的引号)

我们来试试吧:

> x <- 3  
> g(x) <- 4  
[1] 3  
[1] 4  
Run Code Online (Sandbox Code Playgroud)

到目前为止没什么异常的......

> g(x) <- a  
Error: object 'a' not found  
Run Code Online (Sandbox Code Playgroud)

这是出乎意料的.名称a应打印为语言对象.

> g(x) …
Run Code Online (Sandbox Code Playgroud)

r promise

15
推荐指数
2
解决办法
376
查看次数

自动转义unicode字符

如何显示unicode字符串,例如:

x <- "•"
Run Code Online (Sandbox Code Playgroud)

使用其转义的等价物?

y <- "\u2022"

identical(x, y)
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)

(我希望能够这样做,因为CRAN包必须只包含ASCII,但有时你想在错误信息中使用unicode或类似的)

r

12
推荐指数
2
解决办法
4062
查看次数

弄透乳胶纸

许多期刊要求提交盲文版本的论文.盲目版本通常会删除:

  • 作者名单
  • 对作者工作的任何引用

如何在不手动操作的情况下创建手稿的盲版?

latex citations

11
推荐指数
2
解决办法
2633
查看次数

在data.frame中有效地定位分组常量列

如何从数据框中有效地提取分组常量列?我在下面包含了一个plyr实现,以准确地说明我正在尝试做什么,但它很慢.我怎样才能尽可能高效地做到这一点?(理想情况下,根本不分割数据帧).

base <- data.frame(group = 1:1000, a = sample(1000), b = sample(1000))
df <- data.frame(
  base[rep(seq_len(nrow(base)), length = 1e6), ], 
  c = runif(1e6), 
  d = runif(1e6)
)


is.constant <- function(x) length(unique(x)) == 1
constant_cols <- function(x) head(Filter(is.constant, x), 1)
system.time(constant <- ddply(df, "group", constant_cols))
#   user  system elapsed 
# 20.531   1.670  22.378 
stopifnot(identical(names(constant), c("group", "a", "b")))
stopifnot(nrow(constant) == 1000)
Run Code Online (Sandbox Code Playgroud)

在我的实际用例(深入ggplot2内)中,可能存在任意数量的常量和非常量列.示例中的数据大小大约是正确的数量级.

r plyr dataframe

7
推荐指数
1
解决办法
694
查看次数

ActiveRecord :: StatementInvalid:找不到表'tablename'

cis.statbib.org: script/console 
Loading development environment (Rails 2.2.2)
Article.founc>> Article.count()
ActiveRecord::StatementInvalid: Could not find table 'article'
    from /home/hadley/web/cis.statbib.org/vendor/rails/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb:29:in `table_structure'
    from /home/hadley/web/cis.statbib.org/vendor/rails/activesupport/lib/active_support/core_ext/object/misc.rb:39:in `returning'
...
Run Code Online (Sandbox Code Playgroud)

但它似乎确实存在于数据库中:

db: sqlite3 development.sqlite3 
SQLite version 3.2.8
sqlite> select count(*) from author;
168600
Run Code Online (Sandbox Code Playgroud)

我刚刚更新了所有的宝石,等等.出了什么问题?

sqlite ruby-on-rails

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