apply仅在一个边距上操作时似乎不会重新组装 3D 阵列。考虑:
arr <- array(
runif(2*4*3),
dim=c(2, 4, 3),
dimnames=list(a=paste0("a", 1:2), b=paste0("b", 1:4), c=paste0("c", 1:3))
)
# , , c = c1
#
# b
# a b1 b2 b3 b4
# a1 0.7321399 0.8851802 0.2469866 0.9307044
# a2 0.5896138 0.6183046 0.7732842 0.6652637
#
# , , c = c2
# b
# a b1 b2 b3 b4
# a1 0.5894680 0.7839048 0.3854357 0.56555024
# a2 0.6158995 0.6530224 0.8401427 0.04044974
#
# , , c = c3
# …Run Code Online (Sandbox Code Playgroud) 我正在使用.Call界面编写R扩展,我正在尝试追踪堆栈不平衡警告.如果我能够在代码中的各个点查询堆栈高度以隔离在调用它们的相同SEXP PROTECT堆栈高度时没有返回的内部C函数,我会发现它非常有用.
有没有办法做到这一点?
是的,我意识到如果我使用Rcpp,我就不必担心这一点,但是我在这里太深入了.
一种不太理想的可能性是如下模式:
int start, end;
PROTECT_WITH_INDEX(R_NilValue, &start);
UNPROTECT(1);
call_to_suspect_fun();
PROTECT_WITH_INDEX(R_NilValue, &end);
UNPROTECT(1);
if(start != end) error("Stack imbalance right here!");
Run Code Online (Sandbox Code Playgroud)
这似乎超级尴尬.我想这很容易变成一个函数,但如果没有更好的内置选项,我会感到惊讶.
我有一个大型数据集,我试图根据两个单独列的值进行过滤。对于每一行,我有一列显示其总计数 (tot),一列显示看到该类型样本的总次数 (tot.type)。
例如,我想根据 (tot) 和 (tot.type) 过滤数据,其中 (tot) OR (tot.type) 必须大于或等于 2。
我发现的基于多个值进行过滤的所有示例都使用“AND”,但没有使用“OR”的地方......
Example data:
name = c("A","B","C","D","E")
rx = c(1,0,2,1,1)
ry = c(0,1,1,0,0)
rz = c(0,0,2,2,3)
type = c("p","q","r","p","r")
tot = c(1,1,5,3,4)
tot.type = c(2,1,2,2,2)
test = data.frame(name,rx,ry,rz,tot,tot.type)
Run Code Online (Sandbox Code Playgroud)
在此示例中,我将丢弃 B 行,并保留其余行。
我已根据一列或另一列将数据过滤为 2 个单独的数据集,然后将它们合并,但这是否可以在生成一个数据集的一行中完成,而不是先执行两个单独的数据集,然后再将它们合并?
由于R向量索引从1开始,允许索引为零的重点是什么:
rivers[0]
#numeric(0)
Run Code Online (Sandbox Code Playgroud)
这将返回零长度向量.为什么不出错?这有用吗?
我在S3和S4类的上下文中进行了一些分析,并观察了以下内容:
与相应普通列表上的相同操作相比,对S3对象元素的简单值赋值大约慢2-3倍.
从我的角度来看,S3类是一个带有附加属性的列表,元素只是一个数字.那么,哪些机制消耗额外的时间?
value <- 1
obj_list <- list( a = 0 )
obj_s3 <- structure( obj_list, class = "myclass" )
system.time(
replicate( 100000, obj_list$a <- value)
) # ~180 ms
system.time(
replicate( 100000, obj_s3$a <- value)
) # ~420 ms
Run Code Online (Sandbox Code Playgroud) 我想从data.table为每个组生成一个散点图并从函数返回它.
我可以使用plot(下图)生成不同的图表,所以我假设这不是data.table问题:
dt = data.table(A = c(1,2,3,4), B = c(1,1,2,2), C = c(4,5,6,7))
result = dt[, list(plot = list(plot(A, C))), by = B]
Run Code Online (Sandbox Code Playgroud)
但是如果我尝试用qplot做同样的事情(为了获得我可以返回的情节),我似乎最终得到了第二张图的两个副本.
dt = data.table(A = c(1,2,3,4), B = c(1,1,2,2), C = c(4,5,6,7))
result = dt[, list(plot = list(qplot(A, C))), by = B]
result[1,][["plot"]]
result[2,][["plot"]]
Run Code Online (Sandbox Code Playgroud)
如果我错过了一些明显的东西/做一些愚蠢的事情,我会道歉.
file文档中的一篇文章引起了我的注意:
## We can do the same thing with an anonymous file.
Tfile <- file()
cat("abc\ndef\n", file = Tfile)
readLines(Tfile)
close(Tfile)
Run Code Online (Sandbox Code Playgroud)
这个匿名文件究竟是什么?它是存在于磁盘上还是仅存在于内存中?我对此感兴趣,因为我正在考虑一个可能需要创建/删除数千个临时文件的程序,如果这只发生在内存中,它似乎对系统资源的影响要小得多.
这个linux SO Q似乎暗示这个文件可能是一个真正的磁盘文件,但我不确定这个特定的例子是多么相关.此外,这个大内存文档似乎暗示了一个真正的基于磁盘的存储(虽然我假设file正在使用基于匿名的文件):
还应注意,用户可以通过将""指定为filebacking参数来创建"匿名"文件支持的big.matrix.在这种情况下,后备驻留在临时目录中,并且不会创建描述符文件.这些应该谨慎使用,因为即使是匿名的备份也会使用磁盘空间,最终可能会填满硬盘驱动器.当操作系统认为合适时,手动,由用户或自动删除匿名备份.
或者,如果textConnection适合用于此类应用程序(打开/关闭数百/数千次)并且仅满足我的需求的内存.我正计划这样做,直到我阅读该函数文档中的注释:
由于输出文本连接使字符向量逐行保持最新,因此使用它们相对昂贵,并且通常最好使用匿名文件()连接来收集输出.
有没有办法确保mutate_each_(或者可能funs_)在父框架中查找函数?考虑:
library(dplyr) # 0.4.1
library(magrittr) # 1.5
fun_list <- list(a=quote(rev), b=quote(sort))
iris[1:5, 1:2] %>% mutate_each_(funs_(fun_list), c("Sepal.Length"))
Run Code Online (Sandbox Code Playgroud)
像你期望的那样工作:
Sepal.Length Sepal.Width a b
1 5.1 3.5 5.0 4.6
2 4.9 3.0 4.6 4.7
3 4.7 3.2 4.7 4.9
4 4.6 3.1 4.9 5.0
5 5.0 3.6 5.1 5.1
Run Code Online (Sandbox Code Playgroud)
但:
my_rev <- rev
my_srt <- sort
fun_list2 <- list(a=quote(my_rev), b=quote(my_srt))
iris[1:5, 1:2] %>% mutate_each_(funs_(fun_list2), c("Sepal.Length"))
Run Code Online (Sandbox Code Playgroud)
错误:
Error in mutate_impl(.data, dots) : could not find function "my_rev"
Run Code Online (Sandbox Code Playgroud)
一个简单的mutate作品: …
我有一个数据集,每个主题的不同列中包含相同的变量。我想将它们合并到同一列。
例如:,我有这个数据框,并且有三个 DV,但它们位于不同主题的不同列(A、B、C)中。
data.frame(ID = c(1,2,3), DV1_A=c(1,NA,NA), DV1_B= c(NA,4,NA), DV1_C = c(NA,NA,5), DV2_A=c(3,NA,NA), DV2_B=c(NA,3,NA), DV2_C=c(NA,NA,5), FACT = c("A","B","C"))
Run Code Online (Sandbox Code Playgroud)
如何将它们合并为两列?所以结果是:
data.frame(ID = c(1,2,3), DV1_A=c(1,NA,NA), DV1_B= c(NA,4,NA), DV1_C = c(NA,NA,5), DV2_A=c(3,NA,NA), DV2_B=c(NA,3,NA), DV2_C=c(NA,NA,5), FACT = c("A","B","C"), DV_1 = c(1,4,5), DV_2 = c(3,3,5))
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法来始终忽略 R 中浮点数之间的微小差异(根据 IEC 60559,这些是双精度浮点数),通过使用基础 R 工具而不使用 C 或 C++。换句话说,我想“舍入”双精度浮点数的有效数部分,这样像这样的东西返回 TRUE 而不是 FALSE:
1.45 - .55 == 2.45 - 1.55
## [1] FALSE
Run Code Online (Sandbox Code Playgroud)
就像是:
round_significand(1.45 - .55, bits=48) == round_significand(2.45 - 1.55, bits=48)
## [1] TRUE
Run Code Online (Sandbox Code Playgroud)
一个简单的方法round不起作用,因为我们需要四舍五入的级别取决于数字的大小。
data.table在内部做一些类似的事情,从?setNumericRounding:
计算机无法使用基数 2 精确表示某些浮点数(例如 0.6)。这会导致在连接或分组“数字”类型的列时出现意外行为;即“双倍”,请参见下面的示例。在不希望出现这种情况的情况下,data.table 允许将此类数据四舍五入到大约 11 sf,这在许多情况下是足够的数字。这是通过舍入有效数的最后 2 个字节来实现的。其他可能的值是 1 字节舍入或不舍入(全精度,默认值)。
我正在研究一个 hack 实现,它将所有内容缩放为一个十进制数x,floor(log10(x)) == 1并且四舍五入,例如:
rnd_sig <- function(x, precision=10) {
exp <- floor(log10(abs(x)))
round(x * 10 ^ (-exp), precision) / 10 ^ …Run Code Online (Sandbox Code Playgroud) 是否有一个简单的工作流来编写将对象存储为.rds或.rda的测试,以便将来运行的测试可以比较代码执行的结果与存储的对象?这样可以很容易地检查返回有些复杂值的函数是否仍然按预期运行.
例如,类似于:
test_obj(res <- lm(y ~ x, data.frame(x=1:3, y=5:7)))
Run Code Online (Sandbox Code Playgroud)
如果*extdata/test_obj.res.rds*不存在,将在*inst/extdata/test_obj.res.rds*中创建它,res从上面开始,但如果确实存在,则会相同/ all.equal等新生成的对象与从rds中恢复的对象.
我会发现这样的测试超级有用,我有点惊讶RUnit/svUnit/test没有实现某种类型的东西(我希望他们这样做,我只是没有找到它).
testthat::make_expectation是接近,但我更喜欢有自动存储/检索rds,而不是将文本表示复制粘贴到文件,我认为你应该如何使用testthat::make_expectation(我想我可以管道stdout()到一个. R文件,但即使这样,也有一些自动化可以促进这个过程).
所以我买了一本关于R和自动数据收集的书,其中一个例子让我感到困惑.
我有一个日期列的表格,其中包含类似"2001-"的数字.根据教程,下面的行将通过单独输出前四位数字从日期中删除" - ":
yend_clean <- unlist(str_extract_all(danger_table$yend, "[[:digit:]]4$"))
Run Code Online (Sandbox Code Playgroud)
当我运行此命令时,"yend_clean"只是设置为"character(empty)".
如果我删除"4 $",我将所有日期拆分为原子,这样原来看起来像这个"1992","2003"的列表现在看起来像这个"1","9"等.
所以我怀疑"4 $"周围存在的问题.我找不到任何有关这方面的文档,可以帮助我找出正确的解决方案.
希望有人在这里能指出我正确的方向.