小编Ite*_*tor的帖子

与HDF5或netCDF相比,使用.Rdata文件有什么缺点?

我被要求更改当前导出.Rdata文件的软件,以便以"平台无关的二进制格式"导出,例如HDF5或netCDF.有两个原因:

  1. Rdata文件只能由R读取
  2. 二进制信息的存储方式取决于操作系统或体系结构

我还发现 "R数据导入导出手册"没有讨论Rdata文件,尽管它确实讨论了HDF5和netCDF.

对R-帮助的讨论表明,.Rdata文件是平台无关的.

问题:

  1. 这些担忧在多大程度上有效?
    • 例如,Matlab可以在不调用R的情况下读取.Rdata吗?
  2. 在这方面,其他格式比.Rdata文件更有用吗?
  3. 是否有可能编写一个脚本来创建所有.Rdata文件的.hdf5类似物,最大限度地减少对程序本身的更改?

file-format r hdf5 netcdf

27
推荐指数
3
解决办法
5683
查看次数

为什么在数据帧上运行"独特"比在R中的矩阵更快?

我开始相信数据框没有矩阵优势,除了符号方便.但是,当unique在矩阵和数据帧上运行时,我注意到这种奇怪:它似乎在数据帧上运行得更快.

a   = matrix(sample(2,10^6,replace = TRUE), ncol = 10)
b   = as.data.frame(a)

system.time({
    u1 = unique(a)
})
 user  system elapsed
1.840   0.000   1.846


system.time({
    u2 = unique(b)
})
 user  system elapsed
0.380   0.000   0.379
Run Code Online (Sandbox Code Playgroud)

随着行数的增加,定时结果更加明显.所以,这个问题有两个部分.

  1. 为什么矩阵的速度会变慢?转换为数据帧,运行unique,然后转换回来似乎更快.

  2. 有什么理由不只是包装uniquemyUnique,它执行转换部分#1?


注意1.鉴于矩阵是原子的,unique对于矩阵来说似乎应该更快,而不是更慢.能够迭代固定大小的连续内存块通常比运行在链接列表的单独块上更快(我假设数据帧是如何实现的......).

注2:如表现所示data.table,unique在数据框或矩阵上运行是一个相对糟糕的想法 - 请参阅Matthew Dowle的答案和相关时间的评论.我已经将很多对象迁移到数据表中,这种性能是另一个原因.因此,尽管用户应该很好地采用数据表,但出于教学/社区的原因,我现在要问的问题是,为什么这需要花费更长的时间来处理矩阵对象.下面地址的答案,其中没有时间去了,怎么回事,我们可以得到更好的性能(即数据表).这个问题的答案,为什么就在眼前-该代码可以通过发现unique.data.frameunique.matrix.:)一个英语解释它正在做什么以及为什么缺乏这一切.

performance r matrix dataframe data.table

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

R中标准模型对象的关键组件和功能是什么?

我在R中实现了一个新的统计模型,它在我的沙箱中工作,但我想让它更标准.一个很好的比较是lm(),我可以采取模型对象和:

  • 应用该summary()功能
  • 提取模型的系数
  • 从拟合(训练)数据中提取残差
  • 更新模型
  • 应用该predict()功能
  • 适用plot()于预先选择的描述性图表
  • 从事许多其他类型的快乐

我查看了R手册,在线搜索,翻阅了几本书,除非我忽略了什么,否则我找不到一个关于应该进入新模型包的好教程.

虽然我最感兴趣的是完整的参考文献或指南,但我会将这篇文章重点放在一个包含两个组成部分的问题上:

  1. 通常期望在模型对象中有哪些关键组件?
  2. 什么是通常在建模包中实现的典型函数?

答案可以来自R Core(或包开发人员)的角度或从用户的角度来看,例如用户期望能够使用诸如汇总,预测,残差,系数之类的函数,并且通常期望在拟合模型时传递公式.

statistics modeling r

25
推荐指数
2
解决办法
1821
查看次数

识别R函数和脚本的依赖关系

我正在筛选使用该包的包和脚本,并希望识别外部依赖项.目标是修改脚本以指定library(pkgName)和修改要使用的包中的函数require(pkgName),以便稍后这些依赖性将更加明显.

我正在修改代码以考虑每个外部相关的包.作为一个例子,虽然它绝不是决定性的,但我现在发现很难识别依赖的代码data.table.我可以取代data.tableMatrix,ggplot2,bigmemory,plyr,或许多其他包,所以随时与基于其他包的例子来回答.

这种搜索并不是特别容易.我到目前为止尝试过的方法包括:

  • 搜索代码libraryrequire语句
  • 搜索data.table(例如library(data.table))的提及
  • 尝试运行codetools::checkUsage以确定可能存在某些问题的位置.对于脚本,我的程序将脚本插入本地函数并应用于checkUsage该函数.否则,我checkUsagePackage用于包.
  • 寻找有些独特的陈述data.table,例如:=.
  • 查找可通过匈牙利表示法识别对象类的位置,例如 DT

我搜索的本质是找到:

  • 装载data.table,
  • 名称表明它们是data.table对象的对象,
  • 似乎是data.table特定的方法

唯一容易的部分似乎是找到包装的位置.不幸的是,并非所有函数都可以显式加载或需要外部包 - 这些可能假设它已经被加载.这是一个不好的做法,我正在努力解决它.但是,搜索对象和方法似乎具有挑战性.

这(data.table)只是一个包,一个似乎是有限的和一些独特的用法.假设我想寻找ggplot函数的用法,其中选项更广泛,并且语法的文本不是特殊的(即频繁使用+不是特殊的,而:=似乎是).

我不认为静态分析会给出一个完美的答案,例如,可以将参数传递给函数,该函数指定要加载的包.尽管如此:是否有任何核心工具或软件包可以通过静态或动态分析改进这种强力方法?

对于它的价值,tools::pkgDepends只能解决包级别的依赖关系,而不是函数或脚本级别,这是我正在处理的级别.


更新1:应该工作的动态分析工具的一个示例是报告在代码执行期间加载哪些包的工具.我不知道R中是否存在这样的功能 - 这就像Rprof报告输出search()而不是代码堆栈一样.

dependencies code-analysis r

24
推荐指数
1
解决办法
3757
查看次数

R向导的参考

基于这个答案,我了解了一类可以从R访问的特殊内部函数:通过访问的一组函数.Internal(specialFunction).如果有人查询,?.Internal可能会发现以下摘录:

只有真正的R向导才应该考虑使用此函数,只有R开发人员才能添加到内部函数列表中.

我想为我的OWL有趣的R功能掌握魔药和防御暗黑艺术.R向导在哪里可以找到内部函数的列表和描述? 只要它不涉及分裂我的灵魂.

r internals

18
推荐指数
1
解决办法
1182
查看次数

在控制流中使用Next

控制流帮助页面中似乎没有任何"下一次"用法的示例.我希望它根据脚本中的条件跳到下一个迭代.

使用下面的例子,假设我不希望它打印,除非x[i] > 5预期的输出在屏幕上是5到10:

x <- 1:100
for(i in 1:10) {
# next(x[i] < 5) # Just for conceptualizing my question.
print(x[i])
}
Run Code Online (Sandbox Code Playgroud)

我将如何实现使用next以完成上面显示的内容?

r

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

计算相似度的方法

我正在做一个社区网站,要求我计算任何两个用户之间的相似性.使用以下属性描述每个用户:

年龄,皮肤类型(油性,干性),头发类型(长,短,中),生活方式(活跃的户外爱好者,电视垃圾)等.

任何人都可以告诉我如何解决这个问题或指向我一些资源?

statistics pattern-recognition similarity data-mining social-networking

17
推荐指数
2
解决办法
9473
查看次数

用适当的精度数字校正R中的"摘要"

一个简单的问题简单的貌似无辜的功能:summary.

直到我看到Min和Max的结果超出了我的数据范围,我才意识到它summary有一个digits参数来指定输出结果的精度.我的问题是如何以干净,普遍的方式解决这个问题.

以下是此问题的示例:

set.seed(0)
vals    <- 1 + 10 * 1:50000
df      <- cbind(rnorm(10000),sample(vals, 10000), runif(10000))
Run Code Online (Sandbox Code Playgroud)

应用summaryrange,我们得到以下输出 - 注意范围值与最小值和最大值之间的差异:

    > apply(df, 2, summary)

                [,1]   [,2]      [,3]
    Min.    -3.703000     11 6.791e-05
    1st Qu. -0.668500 122800 2.498e-01
    Median   0.009778 248000 5.014e-01
    Mean     0.010450 248800 5.001e-01
    3rd Qu.  0.688800 374000 7.502e-01
    Max.     3.568000 499900 9.999e-01

    >     apply(df, 2, range)
            [,1]   [,2]         [,3]
    [1,] -3.703236     11 6.790622e-05
    [2,]  3.568101 499931 …
Run Code Online (Sandbox Code Playgroud)

precision formatting r

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

如何为R实现"is.error()",以识别和解析错误?

我试图测试对象是否是错误的结果.用例主要是通过一个foreach()产生错误的循环产生的(虽然,对于测试来说,似乎只能将simpleError()一个变量分配给一个变量),我很困惑如何确定何时发生这种情况:我怎么能测试一个实际上,给定对象是一个错误?一旦我确定这是一个错误,除了消息之外我还能提取什么?也许我错过了关于R的错误处理设施的一些东西,因为似乎有必要从头编写错误对象测试功能.

以下是两个示例,一个使用foreach,.errorhandling参数设置为pass.如果数据切片出现异常,我已经开始将其用作大规模或无人值守处理的默认设置.这样的异常是罕见的,并且不值得崩溃整个for循环(特别是如果异常发生在最后,这似乎是我的默认行为murphysListSortingAlgorithm();-)).相反,期望事后检测.

library(foreach)
library(doMC)
registerDoMC(2)
results = foreach(ix = 1:10, .errorhandling = "pass") %dopar%{
    if(ix == 6){
        stop("Perfect")
    } 
    if(ix == 7){
        stop("LuckyPrime")
    } else {
        return(ix)
    }
}
Run Code Online (Sandbox Code Playgroud)

为简单起见,这是一个非常简单的错误(根据定义):

a = simpleError("SNAFU")
Run Code Online (Sandbox Code Playgroud)

虽然似乎没有被这样的命令is.error(),像命令typeof()mode()似乎是毫无意义的,我已经找到了最好的方法是使用class()attributes(),这给那些指示错误的属性.如何以确保我有错误并完全处理该错误的方式使用这些?例如a$message返回SNAFU,但是a$callNULL.我应该期望从中提取任何有用的东西res[[6]]$call吗?


注1:如果一个人没有多核功能来重现第一个例子,我应该指出它results[[6]]不同于simpleError("Perfect"):

> b = simpleError("Perfect")
> …
Run Code Online (Sandbox Code Playgroud)

error-handling r

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

在R中交叉制表两个大型逻辑向量的最快方法

对于两个逻辑矢量,x并且y,长度> 1E8的,什么是计算2×2交叉表格最快的方法?

我怀疑答案是用C/C++编写它,但我想知道R中是否有一些关于这个问题已经非常聪明,因为它并不罕见.

示例代码,对于300M条目(如果3E8太大,可以让N = 1E8;我选择的总大小不到2.5GB(2.4GB).我的目标密度为0.02,只是为了让它更有趣(可以使用稀疏向量,如果这有帮助,但类型转换可能需要时间).

set.seed(0)
N = 3E8
p = 0.02
x = sample(c(TRUE, FALSE), N, prob = c(p, 1-p), replace = TRUE)
y = sample(c(TRUE, FALSE), N, prob = c(p, 1-p), replace = TRUE)
Run Code Online (Sandbox Code Playgroud)

一些明显的方法:

  1. table
  2. bigtabulate
  3. 简单的逻辑运算(例如sum(x & y))
  4. 矢量乘法(嘘)
  5. data.table
  6. 上面的一些,parallelmulticore包(或新parallel包)

我已经尝试了前三个选项(请参阅我的回答),但我觉得必须有更好更好的东西.

我觉得这table很慢. bigtabulate对于一对逻辑向量来说似乎有些过分.最后,进行vanilla逻辑运算看起来像一个kludge,它看了每个向量太多次(3X?7X?),更不用说它在处理期间填充了大量额外的内存,这是一个巨大的时间浪费.

向量乘法通常是一个坏主意,但是当向量稀疏时,可能会因为存储它而获得优势,然后使用向量乘法.

随意改变Np,如果将展示的制表功能,任何有趣的行为.:)


更新1.我的第一个答案给出了三种天真方法的时间,这是相信table速度缓慢的基础.然而,要意识到的关键是"逻辑"方法效率极低.看看它在做什么:

  • 4个逻辑向量运算
  • 4种类型转换(逻辑到整数或FP - 用于sum)
  • 4矢量求和 …

statistics performance r crosstab bigdata

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