相关疑难解决方法(0)

避免在R中使用两个for循环

我有一个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循环并使代码运行得更快?

谢谢你

loops r

10
推荐指数
2
解决办法
6971
查看次数

使用改变参数的lapply

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 lapply

8
推荐指数
2
解决办法
7724
查看次数

"应用"功能有哪些优点?它们什么时候比"for"循环更好用,什么时候不用?

可能重复:
R是否适用于家庭而不是语法糖

正如标题所说的那样.也许是个愚蠢的问题,但我的理解是,当使用"apply"函数时,迭代是在编译代码中而不是在R解析器中执行的.例如,如果存在大量迭代并且每个操作相对简单,那么这似乎意味着lapply仅比"for"循环更快.例如,如果对lapply中包含的函数的单个调用需要10秒,而且只有12次迭代,我会想到使用"for"和"lapply"之间几乎没有任何区别.

既然我想到了,如果必须解析"lapply"中的函数,为什么使用"lapply"而不是"for"会有任何性能上的好处,除非你正在做一些有编译函数的东西(如总结或乘法等)?

提前致谢!

玩笑

parsing for-loop r compilation lapply

8
推荐指数
1
解决办法
1308
查看次数

将函数应用于R中的距离矩阵

这个问题今天出现在操纵邮件列表中.

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的矩阵,它会失败.

有任何想法吗?

algorithm r

7
推荐指数
2
解决办法
2653
查看次数

如何使用tapply并保留值的顺序

希望这不是一个太愚蠢的问题,但仍然是一个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)

提前谢谢了.

r

6
推荐指数
1
解决办法
2154
查看次数

术语"矢量化"在不同的背景下是否意味着不同的东西?

基于我之前读过的内容,矢量化是一种称为SIMD的并行化形式.它允许处理器同时在阵列上执行相同的指令(例如添加).

然而,在阅读关于Julia和R的矢量化性能的矢量化和非矢量化代码之间的关系时,我感到困惑.该帖子声称,Julia和R开发的Julia代码(通过循环)比矢量化代码更快,因为:

这使一些不熟悉R内部的人感到困惑.因此值得注意的是如何提高R代码的速度.性能改进的过程非常简单:首先从devectorized R代码开始,然后用向量化R代码替换它,然后最终在devectorized C代码中实现这个向量化R代码.遗憾的是,最后一步对于许多R用户是不可见的,因此他们认为向量化本身是提高性能的机制.矢量化本身无助于使代码更快.使R中的矢量化有效的原因在于它提供了一种将计算移动到C中的机制,其中一个隐藏的devectorization层可以发挥其神奇作用.

它声称R将用R编写的矢量化代码转换为C中的devectorized代码.如果矢量化更快(作为一种并行化形式),为什么R会驱动代码,为什么这是一个加号?

r vectorization julia

6
推荐指数
2
解决办法
364
查看次数

比较相同向量的相邻元素(避免循环)

我设法写了一个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)

r vector string-comparison sapply

5
推荐指数
1
解决办法
4740
查看次数

使嵌套循环更有效?

我正在使用以下脚本分析大量数据:

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 r-faq

5
推荐指数
2
解决办法
1760
查看次数

lapply/R的承诺

我不确定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:重新聚焦的问题

编辑:具体来说,是否可以编写一个 …

binding r higher-order-functions

5
推荐指数
1
解决办法
280
查看次数

当你有一个额外的变量时,在R中循环以创建许多图

我经常面对的数据有太多的分类变量,无法令人满意地绘制到一个图上.当出现这种情况时,我会写一些东西来循环变量并保存几个特定于该变量的图.

以下示例说明了此过程:

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这样的循环更快的东西.但也许解决方案是这是最好的解决方案.如果有人能改进这一点,我只是很好奇.

提前致谢.

loops r ggplot2

5
推荐指数
1
解决办法
1484
查看次数