我有一个R代码,可以进行两个函数的卷积...
convolveSlow <- function(x, y) {
nx <- length(x); ny <- length(y)
xy <- numeric(nx + ny - 1)
for(i in seq(length = nx)) {
xi <- x[[i]]
for(j in seq(length = ny)) {
ij <- i+j-1
xy[[ij]] <- xy[[ij]] + xi * y[[j]]
}
}
xy
}
Run Code Online (Sandbox Code Playgroud)
有没有办法删除两个for循环并使代码运行得更快?
谢谢你
R教科书继续推广使用lapply而不是循环.即使对于带有参数的函数,这也很容易
lapply(somelist, f, a=1, b=2)
Run Code Online (Sandbox Code Playgroud)
但是如果参数根据列表元素而改变怎么办?假设我的名单包括:
somelist$USA
somelist$Europe
somelist$Switzerland
Run Code Online (Sandbox Code Playgroud)
加上有anotherlist相同的地区,我想用这些不断变化的论点来讨价还价?例如,当f是比率计算时,这可能是有用的.
lapply(somelist, f, a= somelist$USA, b=anotherlist$USA)
Run Code Online (Sandbox Code Playgroud)
是否有方法可以有效地运行这些区域?
编辑:我的问题似乎是我试图使用以前编写的函数没有索引...
ratio <-function(a,b){
z<-(b-a)/a
return(z)
}
Run Code Online (Sandbox Code Playgroud)
这导致了
lapply(data,ratio,names(data))
Run Code Online (Sandbox Code Playgroud)
这不起作用.也许其他人也可以从这个错误中吸取教训
可能重复:
R是否适用于家庭而不是语法糖
正如标题所说的那样.也许是个愚蠢的问题,但我的理解是,当使用"apply"函数时,迭代是在编译代码中而不是在R解析器中执行的.例如,如果存在大量迭代并且每个操作相对简单,那么这似乎意味着lapply仅比"for"循环更快.例如,如果对lapply中包含的函数的单个调用需要10秒,而且只有12次迭代,我会想到使用"for"和"lapply"之间几乎没有任何区别.
既然我想到了,如果必须解析"lapply"中的函数,为什么使用"lapply"而不是"for"会有任何性能上的好处,除非你正在做一些有编译函数的东西(如总结或乘法等)?
提前致谢!
玩笑
这个问题今天出现在操纵邮件列表中.
http://groups.google.com/group/manipulatr/browse_thread/thread/fbab76945f7cba3f
Run Code Online (Sandbox Code Playgroud)
我在改写.
给定距离矩阵(用其计算dist)将函数应用于距离矩阵的行.
码:
library(plyr)
N <- 100
a <- data.frame(b=1:N,c=runif(N))
d <- dist(a,diag=T,upper=T)
sumd <- adply(as.matrix(d),1,sum)
Run Code Online (Sandbox Code Playgroud)
问题是要按行应用函数,你必须存储整个矩阵(而不仅仅是下三角形部分.因此它对大型矩阵使用了太多内存.在我的计算机中,对于大小为10000的矩阵,它会失败.
有任何想法吗?
希望这不是一个太愚蠢的问题,但仍然是一个R初学者我有一个严重的问题与tapply.让我们说
factors <- as.factor( c("a", "b", "c", "a", "b", "c", "a", "b", "c") )
values <- c( 1, 2, 3, 4, 5, NA, 7, NA, NA )
tapply(
values,
factors,
function(x){
if( sum(is.na(x)) == 1 ){
x[ is.na(x) ] <- 0
}
return(x)
}
)
Run Code Online (Sandbox Code Playgroud)
结果是
$a
[1] 1 4 7
$b
[1] 2 5 0
$c
[1] 3 NA NA
Run Code Online (Sandbox Code Playgroud)
但是,我需要的是获得一个保留原始值顺序的向量,即:
c( 1,2,3,4,5,NA,7,0,NA )
Run Code Online (Sandbox Code Playgroud)
提前谢谢了.
基于我之前读过的内容,矢量化是一种称为SIMD的并行化形式.它允许处理器同时在阵列上执行相同的指令(例如添加).
然而,在阅读关于Julia和R的矢量化性能的矢量化和非矢量化代码之间的关系时,我感到困惑.该帖子声称,Julia和R开发的Julia代码(通过循环)比矢量化代码更快,因为:
这使一些不熟悉R内部的人感到困惑.因此值得注意的是如何提高R代码的速度.性能改进的过程非常简单:首先从devectorized R代码开始,然后用向量化R代码替换它,然后最终在devectorized C代码中实现这个向量化R代码.遗憾的是,最后一步对于许多R用户是不可见的,因此他们认为向量化本身是提高性能的机制.矢量化本身无助于使代码更快.使R中的矢量化有效的原因在于它提供了一种将计算移动到C中的机制,其中一个隐藏的devectorization层可以发挥其神奇作用.
它声称R将用R编写的矢量化代码转换为C中的devectorized代码.如果矢量化更快(作为一种并行化形式),为什么R会驱动代码,为什么这是一个加号?
我设法写了一个for loop比较以下向量中的字母:
bases <- c("G","C","A","T")
test <- sample(bases, replace=T, 20)
Run Code Online (Sandbox Code Playgroud)
test 将返回
[1] "T" "G" "T" "G" "C" "A" "A" "G" "A" "C" "A" "T" "T" "T" "T" "C" "A" "G" "G" "C"
Run Code Online (Sandbox Code Playgroud)
通过该功能,Comp()我可以检查字母是否与下一个字母匹配
Comp <- function(data)
{
output <- vector()
for(i in 1:(length(data)-1))
{
if(data[i]==data[i+1])
{
output[i] <-1
}
else
{
output[i] <-0
}
}
return(output)
}
Run Code Online (Sandbox Code Playgroud)
导致;
> Comp(test)
[1] 0 0 0 0 0 1 0 0 0 0 0 1 1 1 …Run Code Online (Sandbox Code Playgroud) 我正在使用以下脚本分析大量数据:
M <- c_alignment
c_check <- function(x){
if (x == c_1) {
1
}else{
0
}
}
both_c_check <- function(x){
if (x[res_1] == c_1 && x[res_2] == c_1) {
1
}else{
0
}
}
variance_function <- function(x,y){
sqrt(x*(1-x))*sqrt(y*(1-y))
}
frames_total <- nrow(M)
cols <- ncol(M)
c_vector <- apply(M, 2, max)
freq_vector <- matrix(nrow = sum(c_vector))
co_freq_matrix <- matrix(nrow = sum(c_vector), ncol = sum(c_vector))
insertion <- 0
res_1_insertion <- 0
for (res_1 in 1:cols){
for (c_1 in 1:conf_vector[res_1]){
res_1_insertion <- res_1_insertion …Run Code Online (Sandbox Code Playgroud) 我不确定R中的承诺是做什么的
如果一个人跑
a = lapply(seq_len(2), function(n) { function() {n}})
b = lapply(seq_len(2), function(n) {n})
Run Code Online (Sandbox Code Playgroud)
我们可以看到
a[[1]]() # == 2
b[[1]] # == 1
Run Code Online (Sandbox Code Playgroud)
我理解R使用promise的对象并懒惰地在其环境中计算表达式,但我不明白为什么为每个函数创建的不同环境不会包含它们自己的n值.
[[1]]
function ()
{
n
}
<environment: 0x7f9b2416ad18>
[[2]]
function ()
{
n
}
<environment: 0x7f9b2416ab20>
as.list(environment(a[[1]]))
$n
[1] 2
as.list(environment(a[[2]]))
$n
[1] 2
Run Code Online (Sandbox Code Playgroud)
是否有可能以某种方式通过lapply函数修复语义?
lapply
function (X, FUN, ...)
{
FUN <- match.fun(FUN)
if (!is.vector(X) || is.object(X))
X <- as.list(X)
.Internal(lapply(X, FUN))
}
<bytecode: 0x7f9b25150f18>
<environment: namespace:base>
Run Code Online (Sandbox Code Playgroud)
PS:重新聚焦的问题
编辑:具体来说,是否可以编写一个 …
我经常面对的数据有太多的分类变量,无法令人满意地绘制到一个图上.当出现这种情况时,我会写一些东西来循环变量并保存几个特定于该变量的图.
以下示例说明了此过程:
library(tidyr)
library(dplyr)
library(ggplot2)
mtcars <- add_rownames(mtcars, "car")
param<-unique(mtcars$cyl)
for (i in param)
{
mcplt <- mtcars %>% filter(cyl==i) %>% ggplot(aes(x=mpg, y=hp)) +
geom_point() +
facet_wrap(~car) +
ggtitle(paste("Cylinder Type: ",i,sep=""))
ggsave(mcplt, file=paste("Type",i,".jpeg",sep=""))
}
Run Code Online (Sandbox Code Playgroud)
每当我看到在线参考循环时,每个人似乎总是表明循环通常不是R中的好策略.如果是这种情况,任何人都可以推荐一种更好的方法来实现与上面相同的结果吗?我特别感兴趣的是像SOOOO这样的循环更快的东西.但也许解决方案是这是最好的解决方案.如果有人能改进这一点,我只是很好奇.
提前致谢.