......关于执行时间和/或记忆.
如果不是这样,请使用代码段进行证明.请注意,矢量化的加速不计算在内.增速必须来自apply(tapply,sapply,...)本身.
我想在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) 为什么这个循环的时间复杂度是非线性的,为什么它如此慢?循环需要~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,因为从新帧中删除/省略了一行,因此 …
假设我想使用以下内容执行模拟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)
在为程序员阅读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类型函数吗?
我有一个矩阵数组。
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?
你能让这个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) 我的循环有一个小问题。这是循环的代码:
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) 我有一个包含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中的循环缓慢?
考虑以下任务.数据集有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这么慢?这是标准任务,我在两种情况下都使用矩阵.有任何想法吗?
我想用以下列表中的值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而不是循环来做到这一点?循环需要很长时间(列表非常大).