相关疑难解决方法(0)

R是否适用于家庭而不是语法糖?

......关于执行时间和/或记忆.

如果不是这样,请使用代码段进行证明.请注意,矢量化的加速不计算在内.增速必须来自apply(tapply,sapply,...)本身.

r apply

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

为什么apply()返回一个转置的xts矩阵?

我想在xts矩阵的所有周期上运行一个函数.apply()非常快,但返回的矩阵与原始对象相比具有转置尺寸:

> dim(myxts)
[1] 7429   48
> myxts.2 = apply(myxts, 1 , function(x) { return(x) })
> dim(myxts.2)
[1]   48 7429
> str(myxts)
An 'xts' object from 2012-01-03 09:30:00 to 2012-01-30 16:00:00 containing:
  Data: num [1:7429, 1:48] 4092500 4098500 4091500 4090300 4095200 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:48] "Open" "High" "Low" "Close" ...
  Indexed by objects of class: [POSIXlt,POSIXt] TZ: 
  xts Attributes:  
 NULL
> str(myxts.2)
 num [1:48, 1:7429] 4092500 4098500 4091100 4098500 0 …
Run Code Online (Sandbox Code Playgroud)

r apply xts

12
推荐指数
1
解决办法
5174
查看次数

为什么这个循环的时间复杂度是非线性的?

为什么这个循环的时间复杂度是非线性的,为什么它如此慢?循环需要~38s for N=50k,~570s for N=200k.有更快的方法吗?Rprof()似乎表明写入内存非常慢.

df <- data.frame(replicate(5, runif(200000)))
df[,1:3] <- round(df[,1:3])

Rprof(line.profiling = TRUE); timer <- proc.time()
x <- df; N <- nrow(df); i <- 1 
ind <- df[1:(N-1),1:3] == df[2:N,1:3]; 
rind <- which(apply(ind,1,all))
N <- length(rind)
while(i <= N)
{
    x$X4[rind[i]+1] <- x$X4[rind[i]+1] + x$X4[rind[i]]
    x$X5[rind[i]+1] <- x$X4[rind[i]+1] * x$X3[rind[i]+1]
    x$X5[rind[i]+1] <- trunc(x$X5[rind[i]+1]*10^8)/10^8
    x$X1[rind[i]] <- NA
    i <- i + 1
};x <- na.omit(x)
proc.time() - timer; Rprof(NULL)
summaryRprof(lines = "show")
Run Code Online (Sandbox Code Playgroud)

该算法的目的是迭代数据帧并组合在某些元素上匹配的相邻行.也就是说,它会删除其中一行,并将该行的某些值添加到另一行.结果数据帧应该少n行,其中n是原始数据帧中匹配的相邻行的数量.每次组合一对行时,源数据帧和新数据帧的索引将不同步1,因为从新帧中删除/省略了一行,因此 …

optimization performance loops r time-complexity

9
推荐指数
1
解决办法
577
查看次数

R中挂着大圈?

假设我想使用以下内容执行模拟function:

fn1 <- function(N) {
  res <- c()
  for (i in 1:N) {
    x <- rnorm(2)
    res <- c(res, x[2]-x[1])
  }
  res
}
Run Code Online (Sandbox Code Playgroud)

对于非常大的N计算似乎挂起.有更好的方法吗?

(灵感来自:https://stat.ethz.ch/pipermail/r-help/2008-February/155591.html)

for-loop r

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

一个基本的R功能

在为程序员阅读R时,我看到了这个功能

oddcount <- function(x) {
  k <- 0
  for (n in x) {
    if (n %% 2 == 1) k <- k+1
  }
  return(k)
}
Run Code Online (Sandbox Code Playgroud)

我更喜欢用更简单的风格(即在lisp中)编写它

(defn odd-count [xs]
  (count (filter odd? xs)))
Run Code Online (Sandbox Code Playgroud)

我看到函数长度相当于count,我可以写奇数?所以有内置的map/filter/remove类型函数吗?

r

6
推荐指数
3
解决办法
1146
查看次数

有效地在数组上“应用”并保留结构

我有一个矩阵数组。

dims <- c(10000,5,5)
mat_array <- array(rnorm(prod(dims)), dims)
Run Code Online (Sandbox Code Playgroud)

我想solve对每个矩阵执行基于矩阵的操作(例如通过函数求逆),但保留数组的完整结构。

到目前为止,我提出了 3 个选项:

选项 1:一个循环,它完全符合我的要求,但笨重且效率低下。

mat_inv <- array(NA, dims)
for(i in 1:dims[1]) mat_inv[i,,] <- solve(mat_array[i,,])
Run Code Online (Sandbox Code Playgroud)

选项 2:该apply函数更快、更清晰,但将每个矩阵压缩为一个向量。

mat_inv <- apply(mat_array, 1, solve)
dim(mat_inv)
[1]    25 10000
Run Code Online (Sandbox Code Playgroud)

我知道我可以设置输出维度以匹配输入的维度,但是我很担心这样做会弄乱索引,特别是如果我必须在不相邻的维度上应用(例如,如果我想在维度 2 上反转) )。

选项 3:包中的aaply函数plyr,它完全符合我的要求,但比其他函数慢得多(4-5 倍)。

mat_inv <- plyr::aaply(mat_array, 1, solve)
Run Code Online (Sandbox Code Playgroud)

是否有任何选项可以将 的速度base::apply与 的多功能性相结合plyr::aaply

arrays r matrix dimension

5
推荐指数
0
解决办法
249
查看次数

如何更快地计算/插入日期差异列?

你能让这个R代码更快吗?看不到如何矢量化它.我有一个数据框如下(下面的示例行):

> str(tt)
'data.frame':   1008142 obs. of  4 variables:
 $ customer_id: int, visit_date : Date, format: "2010-04-04", ...
Run Code Online (Sandbox Code Playgroud)

我想为客户计算visit_dates之间的差异.所以我这样做diff(tt$visit_date),但必须强制执行一个不连续性(NA)到处都是customer_id更改而diff是没有意义的,例如下面的第74行.底部的代码执行此操作,但在1M行数据集上花费大于15分钟.我也尝试了分段计算和cbind'ing每个customer_id(使用which())的subresult ,这也很慢.有什么建议?谢谢.我搜索了SO,R-intro,R manpages等.

   customer_id visit_date visit_spend ivi
72          40 2011-03-15       18.38   5
73          40 2011-03-20       23.45   5
74          79 2010-04-07      150.87  NA
75          79 2010-04-17      101.90  10
76          79 2010-05-02      111.90  15
Run Code Online (Sandbox Code Playgroud)

码:

all_tt_cids <- unique(tt$customer_id)

# Append ivi (Intervisit interval) column
tt$ivi <- c(NA,diff(tt$visit_date))
for (cid in all_tt_cids) {
  # ivi has a discontinuity when …
Run Code Online (Sandbox Code Playgroud)

performance r dataframe

4
推荐指数
1
解决办法
86
查看次数

for 循环 - 替换的长度为零

我的循环有一个小问题。这是循环的代码:

for (i in 1:length(input$count))
{       
    id<-paste("text",i)
    titles[i]<-input$id
}
Run Code Online (Sandbox Code Playgroud)

这将返回以下错误

Titles[i] <- input$id 中的错误:替换长度为零

ui.R

library(shiny)
ui <- fluidPage(
numericInput("count", "Number of textboxes", 3),                  
hr(),
uiOutput("textboxes")
)
Run Code Online (Sandbox Code Playgroud)

服务器R

server <- function(input, output, session) {
   output$textboxes <- renderUI({
   if (input$count == 0)
      return(NULL)
  lapply(1:input$count, function(i) {
      id <- paste0("text", i)
      print(id)            // its prints the text1, text2,text3
      numericInput(id, NULL, value = abc)
      print(input$text1)   //it should print value abc , but it is not, why??

    })
  })
}
Run Code Online (Sandbox Code Playgroud)

for-loop r shiny

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

哪个没有按预期工作

我有一个包含3列和总共10,000个元素的矩阵.第一列和第二列是索引,第三列是分数.我想根据以下公式对得分列进行标准化:

Normalized_score_i_j = score_i_j / ((sqrt(score_i_i) * (sqrt(score_j_j))
Run Code Online (Sandbox Code Playgroud)

score_i_j =当前得分本身

score_i_i =查看第一列中当前得分的索引,并在数据集中查找在第一列和第二列中都包含该索引的得分

score_j_j =在第二列中查看当前得分的索引,并在数据集中查找在第一列和第二列中都包含该索引的得分

例如,如果df如下:

df <- read.table(text = "
First.Protein,Second.Protein,Score
1,1,25
1,2,90
1,3,82
1,4,19
2,1,90
2,2,99
2,3,76
2,4,79
3,1,82
3,2,76
3,3,91
3,4,33
4,1,28
4,2,11
4,3,99
4,4,50
", header = TRUE, sep = ",")
Run Code Online (Sandbox Code Playgroud)

如果我们正常化这一行:

First.Protein Second.Protein Score
4             3              99
Run Code Online (Sandbox Code Playgroud)

标准化分数为:

得分本身除以得分的sqrt,其First.Protein和Second.Protein指数均为4乘以其First.Protein和Second.Protein指数均为3的得分的sqrt.

因此:

Normalized =  99 / (sqrt(50) * sqrt(91)) = 1.467674
Run Code Online (Sandbox Code Playgroud)

我有下面的代码,但它表现得非常奇怪,并且给我的值根本没有标准化,实际上非常奇怪:

for(i in 1:nrow(Smith_Waterman_Scores))
{
  Smith_Waterman_Scores$Score[i] <- 
    Smith_Waterman_Scores$Score[i] / 
    (sqrt(Smith_Waterman_Scores$Score[which(Smith_Waterman_Scores$First.Protein==Smith_Waterman_Scores$First.Protein[i] & Smith_Waterman_Scores$Second.Protein==Smith_Waterman_Scores$First.Protein[i])])) *
    (sqrt(Smith_Waterman_Scores$Score[which(Smith_Waterman_Scores$First.Protein==Smith_Waterman_Scores$Second.Protein[i] & Smith_Waterman_Scores$Second.Protein==Smith_Waterman_Scores$Second.Protein[i])]))
}
Run Code Online (Sandbox Code Playgroud)

r bioinformatics which

3
推荐指数
1
解决办法
122
查看次数

R和Matlab速度之间存在差异

可能重复:
为什么R中的循环缓慢?

考虑以下任务.数据集有20,000个"用户"的变量.每个用户有1到150个观察值.所有用户都堆叠在一个称为数据的矩阵中.第一列是用户的id并标识用户.所有id都存储在名为userid的20,000 X 1矩阵中.

考虑以下R代码

useridl = length(userid)
itime=proc.time()[3]    
for (i in 1:useridl) {
temp =data[data[,1]==userid[i],]
   }
 etime=proc.time()[3]
 etime-itime
Run Code Online (Sandbox Code Playgroud)

此代码仅通过20,000个用户,每次都创建临时矩阵.使用属于userid [i]的观察子集.在MacPro中大约需要6分钟.

在MatLab中,同样的任务

tic
for i=1:useridl
temp=data(data(:,1)==userid(i),:);
end
toc
Run Code Online (Sandbox Code Playgroud)

需要1分钟.

为什么R这么慢?这是标准任务,我在两种情况下都使用矩阵.有任何想法吗?

performance matlab r

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

用lapply替换所有空列表

我想用以下列表中的值0替换所有空列表(数字(0)):

a <- list(numeric(0), 3.13887804749505, c(0.745977548064631, 15.7233179232099, 
4.32068483740438, 19.6680377065919, 9.24007013740377), numeric(0), 
    c(28.8670111833615, 1.27199935252619, 26.6173612819351, 46.8824614685704
    ), c(3.03425142063166, 3.08366863855608, 4.37959434697201, 
    4.00518501422067, 2.05826729526789, 2.29413068424335))
Run Code Online (Sandbox Code Playgroud)

我在尝试这个:

b <- lapply(a, function(x) ifelse(length(x)==0,0,x))
Run Code Online (Sandbox Code Playgroud)

但我从每个列表中得到第一个数字:

list(0, 3.13887804749505, 0.745977548064631, 0, 28.8670111833615, 
    3.03425142063166)
Run Code Online (Sandbox Code Playgroud)

有没有办法用apply而不是循环来做到这一点?循环需要很长时间(列表非常大).

r lapply

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