我正在生成HTML输出,但我遇到R代码输出的输出宽度问题.
我能够毫无困难地调整图形宽度,但是当我尝试编写数据表或因子载荷时,R输出的固定宽度仅为我屏幕宽度的三分之一左右.这导致表的列被拆分而不是单个表中显示的所有列.
这是一个可重复的例子:
---
output: html_document
---
# Title
```{r echo = FALSE, fig.width=16, fig.height=6}
x = matrix(rnorm(100),ncol=10)
x
plot(x)
```
Run Code Online (Sandbox Code Playgroud)
这非常类似于将一个共同功能应用于一个data.table
完整.SDcols
答案的多个列的问题.
不同之处在于我想同时在不属于.SD
子集的另一列上应用不同的函数.我在下面发布一个简单的例子来展示我尝试解决问题:
dt = data.table(grp = sample(letters[1:3],100, replace = TRUE),
v1 = rnorm(100),
v2 = rnorm(100),
v3 = rnorm(100))
sd.cols = c("v2", "v3")
dt.out = dt[, list(v1 = sum(v1), lapply(.SD,mean)), by = grp, .SDcols = sd.cols]
Run Code Online (Sandbox Code Playgroud)
产生以下错误:
Error in `[.data.table`(dt, , list(v1 = sum(v1), lapply(.SD, mean)), by = grp,
: object 'v1' not found
Run Code Online (Sandbox Code Playgroud)
现在这是有道理的,因为v1
列不包含在必须首先计算的列子集中.所以我通过将其包含在我的列子集中进一步探索:
sd.cols = c("v1","v2", "v3")
dt.out = dt[, list(sum(v1), lapply(.SD,mean)), by = grp, .SDcols = …
Run Code Online (Sandbox Code Playgroud) 我有一个57m记录和9列的data.table,当我尝试运行一些摘要统计时,其中一个会导致问题.有问题的列是3699级别的因素,我从以下代码行收到错误:
> unique(da$UPC)
Error in unique.default(da$UPC): hash table is full
Run Code Online (Sandbox Code Playgroud)
现在很明显我只会使用:levels(da$UPC)
但我试图计算每个组中存在的唯一值,作为data.table组语句中多个j参数/ caluclations的一部分.
有趣的unique(da$UPC[1:1000000])
是按预期工作,但unique(da$UPC[1:10000000])
没有.鉴于我的表有57m记录,这是一个问题.
我尝试将因子转换为字符,这没有问题,如下所示:
da$UPC = as.character(levels(da$UPC))[da$UPC]
unique(da$UPC)
Run Code Online (Sandbox Code Playgroud)
这样做确实向我展示了一个额外的"水平" NA
.因此,因为我的数据在因子列中有一些NA,所以唯一函数无法工作.我想知道这是否是开发人员意识到需要修复的东西?我发现以下关于r-devel的文章可能是相关的,但我不确定,也没有提及data.table
.
sessionInfo:
R version 3.0.1 (2013-05-16)
Platform: x86_64-unknown-linux-gnu (64-bit)
locale:
[1] LC_CTYPE=C LC_NUMERIC=C
[3] LC_TIME=en_US.iso88591 LC_COLLATE=C
[5] LC_MONETARY=en_US.iso88591 LC_MESSAGES=en_US.iso88591
[7] LC_PAPER=C LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.iso88591 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] plyr_1.8 data.table_1.8.8
Run Code Online (Sandbox Code Playgroud) 我正试图从串行方法转向并行方法来完成一些大型的多变量时间序列分析任务data.table
.该表包含许多不同组的数据,我正在尝试使用该包从for
循环移动到循环以利用安装的多核处理器.foreach
doParallel
我遇到的问题与内存以及新R进程似乎消耗大量内存有关.我认为正在发生的事情是data.table
包含所有数据的大型数据被复制到每个新进程中,因此我用完RAM并且Windows开始交换到磁盘.
我创建了一个简化的可重现的示例,它复制了我的问题,但循环内部的数据更少,分析更少.如果存在的解决方案只能按需将数据分配给工作进程,或者共享核心之间已经使用的内存,那将是理想的选择.或者,可能已存在某种解决方案将大数据拆分为4个块并将其传递给核心,以便它们具有可用的子集.
之前已经在Stackoverflow上发布了类似的问题,但我无法使用提供的bigmemory
解决方案,因为我的数据包含字符字段.我将进一步研究这个iterators
方案,但是我很欣赏那些在实践中遇到这个问题经验的成员的建议.
rm(list=ls())
library(data.table)
num.series = 40 # can customise the size of the problem (x10 eats my RAM)
num.periods = 200 # can customise the size of the problem (x10 eats my RAM)
dt.all = data.table(
grp = rep(1:num.series,each=num.periods),
pd = rep(1:num.periods, num.series),
y = rnorm(num.series * num.periods),
x1 = rnorm(num.series * num.periods),
x2 = rnorm(num.series * num.periods)
) …
Run Code Online (Sandbox Code Playgroud) 使用foreach
软件包调试这个问题很难,因为我可重复的示例工作正常,但这里是对问题的简要描述以及我想要实现的目标.
我正在使用最初由Steve Weston发布的一些代码,这些代码将data.table
根据一个关键列进行拆分,这是一个因素.迭代器将循环遍历"块",data.table
并且可以访问表的拆分和用于生成拆分(键)的索引值.
虽然这种方法在我之前的各种场合都有用,但在这种情况下,我在foreach
循环中接收并出错.
Error in { : undefined columns selected
Run Code Online (Sandbox Code Playgroud)
触发该问题的代码如下:
library(foreach)
library(data.table)
str(dat.in)
names(dat.in)
class(dat.in$fc.item)
key(dat.in)
library(foreach)
fc = foreach(dt.sub = isplitDT(dat.in, levels(dat.in$fc.item))) %do%
{
# code to execute on each core/iteration
print(dt.sub$key[1])
dt.sub$value
}
Run Code Online (Sandbox Code Playgroud)
数据已经输出dput
,可以在问题的底部找到.
我dat.in
用以下结果检查了我的对象:
> str(dat.in)
Classes ‘data.table’ and 'data.frame': 313 obs. of 3 variables:
$ fc.item: Factor w/ 1 level "A": 1 1 1 1 1 1 1 1 1 …
Run Code Online (Sandbox Code Playgroud) 我希望测试性能R
,更具体地说是forecast
在具有英特尔至强融核协处理器的 HPC 集群上的包中的一些例程。据我了解,系统管理员已R/3.2.5
按照英特尔网站上的说明从源代码构建:https : //software.intel.com/en-us/articles/build-r-301-with-intel-c-compiler-and-intel -mkl-on-linux
因此,可以在使用安装到本地用户特定库的会话中执行R
包括devtools
、data.table
、dplyr
、ggplot2
、在内的软件包的安装。我提到这些包的原因是它们都需要某种形式的编译,因此我需要在我的文件中包含该行以加载编译器。Rcpp
RcppArmadillo
R
install.packages
module load intel/15.2.164
.bashrc
但是,当我开始安装该forecast
软件包时,却失败了。有很长的文本输出流(见下文),但总而言之,似乎与编译器相关的某些事情失败了:
/gpfs/stfc/local/apps/intel/intel_cs/2015.2.164/composer_xe_2015.2.164/compiler/include/complex(115): error #308: member "std::complex<float>::_M_value" (declared at line 1157 of "/usr/include/c++/4.4.7/complex") is inaccessible
return __x._M_value + __y._M_value;
Run Code Online (Sandbox Code Playgroud)
恐怕我对编译软件和管理/安装知之甚少:这些问题以前在我的 Mac 或大学 Linux 集群上从未发生过。
> install.packages("forecast")
Installing package into '/gpfs/stfc/local/HCPhi012/mjw01/mjw93-mjw01/library/R/3.2.5'
(as 'lib' is unspecified)
trying URL 'https://www.stats.bris.ac.uk/R/src/contrib/forecast_7.1.tar.gz'
Content type 'application/x-gzip' length 196896 bytes (192 KB)
==================================================
downloaded …
Run Code Online (Sandbox Code Playgroud) r ×5
data.table ×3
foreach ×2
forecasting ×1
icc ×1
knitr ×1
lapply ×1
memory ×1
na ×1
r-factor ×1
r-markdown ×1
rcpp ×1
subset ×1
unique ×1
xeon-phi ×1