R 何时使用应用功能

R 何时使用应用功能,r,for-loop,apply,R,For Loop,Apply,假设我有这样的东西: # Create some data: treatment <- round(runif(20, min = 0, max = 1),0) d2 <- round(runif(20, min = 0, max = 1),0) bxd2 <- treatment * d2 infection <- round(runif(20, min = 0, max = 100),0) lung <- round(runif(20, min = 0, ma

假设我有这样的东西:

# Create some data:
treatment <- round(runif(20, min = 0, max = 1),0)
d2 <- round(runif(20, min = 0, max = 1),0)
bxd2 <- treatment * d2
infection <- round(runif(20, min = 0, max = 100),0) 
lung <- round(runif(20, min = 0, max = 100),0) 
head <- round(runif(20, min = 0, max = 100),0) 

df <- data.frame(treatment, d2, bxd2, infection, lung, head)

rm(treatment, d2, bxd2, infection, lung, head)


reg_func <- function(i,data){
form <- paste(colnames(df)[i+3], c("treatment + d2 + bxd2"), sep = "~") 
form <- as.formula(form)
print(lm(form, data = data))
}

for (i in 1:3) {
name <- paste0("reg", i)
assign(name, reg_func(i, df))
}
#创建一些数据:
治疗不会快很多:

> a <- seq(300)
> system.time(replicate(1000, sapply(a ,mean)))
   user  system elapsed 
  2.215   0.000   2.216 
> v <- c()
> system.time(replicate(1000, for(i in a){v <- c(v,mean(i))}))
   user  system elapsed 
  2.315   0.000   2.315 

简单的回答是不用担心使用循环。使用apply的主要原因是,第一,在某些情况下它可以更高效,第二,它使代码更干净

但有时这并不能使代码更干净。例如,如果您确实需要一组名为
reg1
reg2
等的变量,而不是名为
reg
的列表,那么您的版本会更干净。由于您每次都在循环中进行回归,因此性能差异将很小,因为大部分工作都在回归中,而不是在循环中,无论您如何编写代码

现在,我认为名为
reg
的列表是存储这些结果的更有用的方法,原因很多。例如,如果您想遍历它们,只需执行
reg[[i]]
,而不是粘贴字符串。但听起来您已经考虑过这个问题,并决定这样命名变量是有原因的。

是的,
apply()
真的不能更快:

> mat <- matrix(rnorm(1000 * 1000), nrow = 1000)
> system.time({
+     v <- numeric(1000)
+     for (i in 1:1000) v[i] <- mean(mat[i, ])
+ })
## user  system elapsed 
## 0.021   0.001   0.023 
>
> system.time(apply(mat, 1, mean))
## user  system elapsed 
## 0.021   0.001   0.022
但是对于列表和数据帧,
lappy()
sapply()
可以更快:

> system.time({
+     v <- numeric(1000)
+     for (i in 1:1000) v[i] <- mean(df[[i]])
+ })
## user  system elapsed 
## 0.015   0.000   0.016 
>
> system.time(sapply(df, mean))
## user  system elapsed 
## 0.008   0.000   0.008
>system.time({
+v系统时间(sapply(df,平均值))
##用户系统运行时间
## 0.008   0.000   0.008

因为R是一种脚本语言,所以速度通常比C++等低级语言慢,所以如果可能的话,使用嵌入二进制代码或字节码的函数,它将节省

限制工作空间中的CRUD的数量;使代码更加透明,以维护需要的人;cy;这样您就可以知道您在模型中预测的结果以及本例中的时间比较是不准确的,因为
sapply
分配了一个新的向量并将结果存储在其中,因此这两个向量的作用不同。但是您的代码在两种情况下产生的结果并不相同,因此比较两个版本的时间并不正确“我不会告诉你一种方法相对于另一种方法的速度。向下投票的理由:一般来说,
apply
不会在这种情况下使用,而是
sapply
lapply
。也忽略了问题的重点,即在pa上循环时,不是关注速度,而是关注代码的清晰性和可维护性。”你如何把我的代码变成一个应用实例,我似乎可以把我的头绕在它周围
lapply(1:3,函数(x)赋值(paste0(“reg”,x),reg_func(x,df)))
> mat <- matrix(rnorm(1000 * 1000), nrow = 1000)
> system.time({
+     v <- numeric(1000)
+     for (i in 1:1000) v[i] <- mean(mat[i, ])
+ })
## user  system elapsed 
## 0.021   0.001   0.023 
>
> system.time(apply(mat, 1, mean))
## user  system elapsed 
## 0.021   0.001   0.022
> system.time(rowMeans(mat))
## user  system elapsed 
## 0.003   0.000   0.003 
> system.time({
+     v <- numeric(1000)
+     for (i in 1:1000) v[i] <- mean(df[[i]])
+ })
## user  system elapsed 
## 0.015   0.000   0.016 
>
> system.time(sapply(df, mean))
## user  system elapsed 
## 0.008   0.000   0.008