小编log*_*thy的帖子

对于高基数分组,为什么使用dplyr管道(%>%)比等效的非管道表达式慢?

我认为一般来说使用%>%不会对速度产生明显影响.但在这种情况下,它运行速度慢了4倍.

library(dplyr)
library(microbenchmark)

set.seed(0)
dummy_data <- dplyr::data_frame(
  id=floor(runif(10000, 1, 10000))
  , label=floor(runif(10000, 1, 4))
)

microbenchmark(dummy_data %>% group_by(id) %>% summarise(list(unique(label))))
microbenchmark(dummy_data %>% group_by(id) %>% summarise(label %>% unique %>% list))
Run Code Online (Sandbox Code Playgroud)

没有管道:

min       lq     mean   median       uq      max neval
1.691441 1.739436 1.841157 1.812778 1.880713 2.495853   100
Run Code Online (Sandbox Code Playgroud)

带管:

min       lq     mean   median       uq      max neval
6.753999 6.969573 7.167802 7.052744 7.195204 8.833322   100
Run Code Online (Sandbox Code Playgroud)

为什么%>%在这种情况下会这么慢?有没有更好的方法来写这个?

performance r cardinality dplyr magrittr

16
推荐指数
1
解决办法
1957
查看次数

什么是拆卸R包的可靠过程,以便进行升级?

我编写了一个使用devtools来包含内部数据的包:

devtools::use_data(.data, internal = T, overwrite = T)
Run Code Online (Sandbox Code Playgroud)

我最近更改了这些数据并重建了包.我想在另一台当前加载旧软件包的机器上升级该软件包:

detach('package:myPackage', unload=T)
remove.packages('myPackage')
install.packages(repos=NULL, 'myPackage.zip')
Run Code Online (Sandbox Code Playgroud)

我检查一下这些变化是否已经完成:

length(myPackage:::.data[[1]])
[1] 2169
Run Code Online (Sandbox Code Playgroud)

不是我期待的......也许重启会有所帮助?

Restarting R session...
length(myPackage:::.data[[1]])
[1] 2179
Run Code Online (Sandbox Code Playgroud)

这是预期的结果.

阅读分离的帮助表明它在某些情况下可能是片状的,例如:

如果在加载了命名空间的包上使用库,则会附加已加载的命名空间的导出.因此,分离和重新附加包可能不会刷新包的一些或所有组件,并且是不可取的.

我的情况是,我想彻底清除加载的包,以便我可以更新它.有没有办法在不重新启动R的情况下执行此操作?


编辑2016/10/28 - 使用下面的可重现示例进行更新

  • 在Windows上测试
  • 需要devtools

...

# setup package in temp dir
pkg_dir <- file.path(tempfile(), 'dummy.test.pkg')
dir.create(pkg_dir, recursive=T)
devtools::create(pkg_dir)
setwd(pkg_dir)

# read description
desc <- readChar('DESCRIPTION', file.size('DESCRIPTION'))

# create and build package v01
.testval <- c(1,2,3)
devtools::use_data(.testval, internal=T, overwrite=T)
v01 <- sub('\\d+\\.\\d+\\.\\d+\\.\\d+', '0.0.0.1', desc, perl=T)
writeChar(v01, 'DESCRIPTION')
bin01 <- …
Run Code Online (Sandbox Code Playgroud)

r devtools install.packages

11
推荐指数
1
解决办法
192
查看次数

在R中推送和弹出列表的更好方法是什么?

如果foo <- list(),foo[[length(foo)+1]] <- bar当我真正想写的时候,我发现自己写了很多东西push(foo, bar).

同样地(尽管不那么频繁)bar <- foo[[length(foo)]]会更好bar <- pop(foo).

  1. 在基地R有更好的方法吗?
  2. 如果不这样做,是否有人编写了一个使这些基本列表操作在语法上更少折磨的包?

这是重复的变量名称杀死了我.考虑:

anInformative.selfDocumenting.listName[[length(anInformative.selfDocumenting.listName)+1]] <- bar
Run Code Online (Sandbox Code Playgroud)

编辑:

foo <- append(foo, bar) 不适合我

foo <- list()
for (i in 1:10) {
  x <- data.frame(a=i, b=rnorm(1,0,1))
  foo[[length(foo)+1]] <- x
}
str(foo)
Run Code Online (Sandbox Code Playgroud)

按预期提供10个对象的列表.

foo <- list()
for (i in 1:10) {
  x <- data.frame(a=i, b=rnorm(1,0,1))
  foo <- append(foo, x)
}
str(foo)
Run Code Online (Sandbox Code Playgroud)

给出了20个对象的列表.

r

9
推荐指数
2
解决办法
6773
查看次数

默认情况下使用相同名称的美学与R中的ggplot?

有时使用ggplot我发现自己使用数据框,其中变量名实际上对应于我想要使用的美学.这会导致像这样的代码:

rect <- data.frame(xmin=1,xmax=10,ymin=1,ymax=10)
ggplot(rect, aes(xmin=xmin,xmax=xmax,ymin=ymin,ymax=ymax))+geom_rect()
Run Code Online (Sandbox Code Playgroud)

感觉有点湿.

有没有办法避免这种重复?

r ggplot2

6
推荐指数
3
解决办法
234
查看次数

在ggplot2中正确使用fun.data和stat_summary?

来自?stat_summary。

fun.data:完整的摘要功能。应将数据帧作为输入,并将返回数据帧作为输出

我很难理解这一点。似乎我的摘要函数so.summary根本没有传递数据帧!

码:

set.seed(0)
so.example <- data.frame(
  sampleID=rep(1:15)
  , sales=runif(15, 0, 1)*1000
  , revenue=runif(15, 0, 1)*10000
)

so.summary <- function(z) {
  print(z)
  data.frame(sales=median(z$sales), revenue=median(z$revenue))
}

ggplot(
  so.example
  , aes(x=sales, y=revenue)
  ) + geom_point() + stat_summary(fun.data=so.summary, geom='point', color='red')
Run Code Online (Sandbox Code Playgroud)

输出:

[1] 2672.207
Error in z$sales : $ operator is invalid for atomic vectors
Run Code Online (Sandbox Code Playgroud)

r ggplot2

5
推荐指数
2
解决办法
4376
查看次数

在R中更改然后更改区域设置的可靠方法是什么?

在一个函数中,我想改变语言环境,做一些事情,然后不改变它.因为副作用很差.

old_locale <- Sys.getlocale()

# do some stuff

Sys.setlocale(old_locale)
Run Code Online (Sandbox Code Playgroud)

但是,Sys.setlocale需要categorylocale论证.

另一方面,Sys.getlocale()给我这个:

"LC_COLLATE=English_Australia.1252;LC_CTYPE=English_Australia.1252;LC_MONETARY=English_Australia.1252;LC_NUMERIC=C;LC_TIME=English_Australia.1252"
Run Code Online (Sandbox Code Playgroud)

好.我可以处理这个问题:

old_locale <- Sys.getlocale()
locale_key_values <- strsplit(strsplit(old_locale, ';')[[1]], '=')[[1]], '=')
locale_keys <- lapply(locale_key_values, getElement, name=1)
locale_values <- lapply(locale_key_values, getElement, name=2)

# do some stuff

mapply(Sys.setlocale, category=locale_keys, locale=locale_values)
Run Code Online (Sandbox Code Playgroud)

问题解决了!

......或者是吗?

Sys.setlocale(locale='C')
Run Code Online (Sandbox Code Playgroud)

Sys.getlocale()现在回来了"C"!这不适合我上面的键值解析器.

我突然意识到我对locales或Sys.getlocale()可能返回的字符串范围一无所知.

有谁知道保存和恢复语言环境状态的可靠方法?

locale r

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

如何在熔化 data.table 时指定空 id.vars 向量?

我想融化 data.table 而不包含任何 ID 列。

dt <- data.table::data.table(iris)[1:10]
data.table::melt(dt, measure.vars=c('Petal.Length', 'Petal.Width'))
Run Code Online (Sandbox Code Playgroud)

如果不指定 id.vars,所有非measure.vars 列都将被视为id.vars。这可以在事后通过仅从熔体中选择变量/值来处理。

例如,下面的代码产生我正在寻找的输出:

data.table::melt(dt, measure.vars=c('Petal.Length', 'Petal.Width'))[,.(variable, value)]
Run Code Online (Sandbox Code Playgroud)

但我认为这应该可以在熔化呼叫本身内实现?我尝试过以下方法但没有成功。

data.table::melt(dt, measure.vars=c('Petal.Length', 'Petal.Width'), id.vars=NULL)
data.table::melt(dt, measure.vars=c('Petal.Length', 'Petal.Width'), id.vars=c())
data.table::melt(dt, measure.vars=c('Petal.Length', 'Petal.Width'), id.vars=list())
Run Code Online (Sandbox Code Playgroud)

从文档中:

如果 id.vars 和measure.vars 都丢失,则所有非数字/整数/逻辑列将被分配为id 变量,其余的将被分配为度量变量。如果仅提供 id.vars 或measure.vars 之一,则其余列将分配给另一列。id.vars 和measure.vars 都可以多次拥有同一列,并且同一列可以同时作为id 和measure 变量。

Melt.data.table 还接受 id 和measure变量的列表列。

r melt data.table

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