我被要求更改当前导出.Rdata文件的软件,以便以"平台无关的二进制格式"导出,例如HDF5或netCDF.有两个原因:
我还发现 "R数据导入导出手册"没有讨论Rdata文件,尽管它确实讨论了HDF5和netCDF.
一对R-帮助的讨论表明,.Rdata文件是平台无关的.
我开始相信数据框没有矩阵优势,除了符号方便.但是,当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)
随着行数的增加,定时结果更加明显.所以,这个问题有两个部分.
为什么矩阵的速度会变慢?转换为数据帧,运行unique
,然后转换回来似乎更快.
有什么理由不只是包装unique
中myUnique
,它执行转换部分#1?
注意1.鉴于矩阵是原子的,unique
对于矩阵来说似乎应该更快,而不是更慢.能够迭代固定大小的连续内存块通常比运行在链接列表的单独块上更快(我假设数据帧是如何实现的......).
注2:如表现所示data.table
,unique
在数据框或矩阵上运行是一个相对糟糕的想法 - 请参阅Matthew Dowle的答案和相关时间的评论.我已经将很多对象迁移到数据表中,这种性能是另一个原因.因此,尽管用户应该很好地采用数据表,但出于教学/社区的原因,我现在要问的问题是,为什么这需要花费更长的时间来处理矩阵对象.下面地址的答案,其中没有时间去了,怎么回事,我们可以得到更好的性能(即数据表).这个问题的答案,为什么就在眼前-该代码可以通过发现unique.data.frame
和unique.matrix
.:)一个英语解释它正在做什么以及为什么缺乏这一切.
我在R中实现了一个新的统计模型,它在我的沙箱中工作,但我想让它更标准.一个很好的比较是lm()
,我可以采取模型对象和:
summary()
功能predict()
功能plot()
于预先选择的描述性图表我查看了R手册,在线搜索,翻阅了几本书,除非我忽略了什么,否则我找不到一个关于应该进入新模型包的好教程.
虽然我最感兴趣的是完整的参考文献或指南,但我会将这篇文章重点放在一个包含两个组成部分的问题上:
答案可以来自R Core(或包开发人员)的角度或从用户的角度来看,例如用户期望能够使用诸如汇总,预测,残差,系数之类的函数,并且通常期望在拟合模型时传递公式.
我正在筛选使用该包的包和脚本,并希望识别外部依赖项.目标是修改脚本以指定library(pkgName)
和修改要使用的包中的函数require(pkgName)
,以便稍后这些依赖性将更加明显.
我正在修改代码以考虑每个外部相关的包.作为一个例子,虽然它绝不是决定性的,但我现在发现很难识别依赖的代码data.table
.我可以取代data.table
有Matrix
,ggplot2
,bigmemory
,plyr
,或许多其他包,所以随时与基于其他包的例子来回答.
这种搜索并不是特别容易.我到目前为止尝试过的方法包括:
library
和require
语句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()
而不是代码堆栈一样.
基于这个答案,我了解了一类可以从R访问的特殊内部函数:通过访问的一组函数.Internal(specialFunction)
.如果有人查询,?.Internal
可能会发现以下摘录:
只有真正的R向导才应该考虑使用此函数,只有R开发人员才能添加到内部函数列表中.
我想为我的OWL有趣的R功能掌握魔药和防御暗黑艺术.R向导在哪里可以找到内部函数的列表和描述? 只要它不涉及分裂我的灵魂.
在控制流帮助页面中似乎没有任何"下一次"用法的示例.我希望它根据脚本中的条件跳到下一个迭代.
使用下面的例子,假设我不希望它打印,除非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
以完成上面显示的内容?
我正在做一个社区网站,要求我计算任何两个用户之间的相似性.使用以下属性描述每个用户:
年龄,皮肤类型(油性,干性),头发类型(长,短,中),生活方式(活跃的户外爱好者,电视垃圾)等.
任何人都可以告诉我如何解决这个问题或指向我一些资源?
statistics pattern-recognition similarity data-mining social-networking
一个简单的问题简单的貌似无辜的功能: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)
应用summary
和range
,我们得到以下输出 - 注意范围值与最小值和最大值之间的差异:
> 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) 我试图测试对象是否是错误的结果.用例主要是通过一个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$call
是NULL
.我应该期望从中提取任何有用的东西res[[6]]$call
吗?
注1:如果一个人没有多核功能来重现第一个例子,我应该指出它results[[6]]
不同于simpleError("Perfect")
:
> b = simpleError("Perfect")
> …
Run Code Online (Sandbox Code Playgroud) 对于两个逻辑矢量,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)
一些明显的方法:
table
bigtabulate
sum(x & y)
)data.table
parallel
从multicore
包(或新parallel
包)我已经尝试了前三个选项(请参阅我的回答),但我觉得必须有更好更好的东西.
我觉得这table
很慢. bigtabulate
对于一对逻辑向量来说似乎有些过分.最后,进行vanilla逻辑运算看起来像一个kludge,它看了每个向量太多次(3X?7X?),更不用说它在处理期间填充了大量额外的内存,这是一个巨大的时间浪费.
向量乘法通常是一个坏主意,但是当向量稀疏时,可能会因为存储它而获得优势,然后使用向量乘法.
随意改变N
和p
,如果将展示的制表功能,任何有趣的行为.:)
更新1.我的第一个答案给出了三种天真方法的时间,这是相信table
速度缓慢的基础.然而,要意识到的关键是"逻辑"方法效率极低.看看它在做什么:
sum
)r ×9
statistics ×3
performance ×2
bigdata ×1
crosstab ×1
data-mining ×1
data.table ×1
dataframe ×1
dependencies ×1
file-format ×1
formatting ×1
hdf5 ×1
internals ×1
matrix ×1
modeling ×1
netcdf ×1
precision ×1
similarity ×1