这是对这个问题的直接扩展.我有一个数据集,我想根据变量x和y找到变量v的所有成对组合:
library(data.table)
DT = data.table(x=rep(c("a","b","c"),each=6), y=c(1,1,6), v=1:18)
x y v
1: a 1 1
2: a 1 2
3: a 6 3
4: a 1 4
5: a 1 5
6: a 6 6
7: b 1 7
8: b 1 8
9: b 6 9
10: b 1 10
11: b 1 11
12: b 6 12
13: c 1 13
14: c 1 14
15: c 6 15
16: c 1 16
17: c 1 17 …Run Code Online (Sandbox Code Playgroud) 此代码生成一个类似于我自己的数据集:
df <- c(seq(as.Date("2012-01-01"), as.Date("2012-01-10"), "days"))
df <- as.data.frame(df)
df <- rbind(df, df)
id <- c(rep.int(1, 10), rep.int(2, 10))
id <- as.data.frame(id)
cnt <- c(1:3, 0, 0, 4, 5:8, 0, 1, 0, 1:7)
cnt <- as.data.frame(cnt)
df <- cbind(id, df, cnt)
names(df) <- c("id", "date", "cnt")
df$date[df$date == "2012-01-10"] <- "2012-01-20"
Run Code Online (Sandbox Code Playgroud)
我试图找到过去7天内发生的变量'cnt'的总和.有时日期不是连续的(参见前面'df'中的最后一个日期) - 按id.
这是循环:
system.time(
for(i in 1:length(df$date)) {
df$cnt.weekly[i] <-
sum(df$cnt[which((df$date == df$date[i] - 1) & df$id == df$id[i])],
df$cnt[which((df$date == df$date[i] - 2) & df$id == df$id[i])], …Run Code Online (Sandbox Code Playgroud) 我创建了以下代码,将 for 循环嵌套在 R 中的 for 循环内。它是计算 Power 的模拟。我读到 R 不太适合执行 for 循环,但我想知道是否可以应用任何效率来使其运行得更快一些。我对 R 以及任何类型的编程都很陌生。现在我看到的运行时间是:
m=10 我得到 0.17 秒
m=100 我得到 3.95 秒
m=1000 我得到 246.26 秒
m=2000 我得到 1003.55 秒
我希望将采样次数设置为 100K 以上,但恐怕甚至无法将其设置为 10K
这是代码:
m = 1000 # number of times we are going to take samples
popmean=120 # set population mean at 120
popvar=225 # set known/established population
variance at 225
newvar=144 # variance of new methodology
alpha=.01 # set alpha
teststatvect = matrix(nrow=m,ncol=1) # empty vector …Run Code Online (Sandbox Code Playgroud) 可能重复:
加速R中的循环操作
我有几个关于循环的问题.我知道R使用矢量化计算可以更快地工作,我想更改下面的代码来利用这一点.在论坛上查看其他一些答案,sapply函数似乎能够替换inside for循环,但我生成一个零向量,所以有一个错误.陶仍然是1000,我认为这是造成问题的原因.
我主要关心的是速度,因为我需要围绕整个算法创建一个循环,并绘制不同的V和n尺寸以进行进一步分析.
谢谢你的帮助
替代循环
tao = 1000
L = (tao - 1)
n = 10
V = 5
I = 10000
V_s = matrix(rnorm(I), I, 1)
V_b = matrix(rnorm(I), I, 1)
signal <- matrix(0, L, 1)
for( j in (n:L)){
sapply(((j-n+1):j),function (tao) signal[j] = signal[j] + abs(V_s[tao] - V_b[tao]))
signal[j] = (signal[j] / (n * V) )
}
Run Code Online (Sandbox Code Playgroud)
原始循环
tao = 1000
L = (tao - 1)
n = 10
V = 5
I = 10000
V_s …Run Code Online (Sandbox Code Playgroud) 我试图从矢量创建这样的矩阵:
vec= c(2, 5, 9)
> A
[,1] [,2] [,3] [,4]
[1,] 2 0 0 0
[2,] 5 3 0 0
[3,] 9 7 4 0
Run Code Online (Sandbox Code Playgroud)
实际上,第一列始终是向量元素,第二列以0开始,然后是(5-2 = 3),然后第二列的thirld元素是(9-2 = 7).然后第三列从0开始,然后是0和(9-5 = 4),最后一列始终为零.可能是vec更改为任何数字的长度,例如4,5,.......如何编写有效的函数或代码来创建此矩阵?
我可以想到几种方法来将元素添加到循环中的向量中。对于大循环,时间和内存变得很重要。哪个内存/时间效率最高?
vec <- c()
for (i in 1:10) {
vec <- c(vec, i)
}
Run Code Online (Sandbox Code Playgroud)
vec <- c()
for (i in 1:10) {
vec <- append(vec, i)
}
Run Code Online (Sandbox Code Playgroud)
vec <- c()
for (i in 1:10) {
vec[i] <- i
}
Run Code Online (Sandbox Code Playgroud)
我想根据前一行和同一列的值逐步增加一个新列。你可以用一个循环来做,就像这样:
df <- data.frame(a = 2000:2010,
b = 10:20,
c = seq(1000, 11000, 1000),
x = 1000)
for(i in 2:nrow(df)) df$x[i] <- (df$c[i]) * df$a[i-1] / df$x[i-1] + df$b[i] * df$a[i]
df
a b c x
1 2000 10 1000 1000.00
2 2001 11 2000 26011.00
3 2002 12 3000 24254.79
4 2003 13 4000 26369.16
5 2004 14 5000 28435.80
6 2005 15 6000 30497.85
7 2006 16 7000 32556.20
8 2007 17 8000 34611.93
9 2008 18 9000 …Run Code Online (Sandbox Code Playgroud) 使用apply系列中的函数可以轻松地在R中加速循环.如何在下面的代码中使用apply函数来加快速度?注意,在循环内,在每次迭代时,置换一列并将函数应用于新数据帧(即,具有一列置换的初始数据帧).我似乎无法申请工作,因为必须在循环内构建新的数据框.
#x <- data.frame(a=1:10,b=11:20,c=21:30) #small example
x <- data.frame(matrix(runif(50*100),nrow=50,ncol=100)) #larger example
y <- rowMeans(x)
start <- Sys.time()
totaldiff <- numeric()
for (i in 1:ncol(x)){
x.after <- x
x.after[,i] <- sample(x[,i])
diff <- abs(y-rowMeans(x.after))
totaldiff[i] <- sum(diff)
}
colnames(x)[which.max(totaldiff)]
Sys.time() - start
Run Code Online (Sandbox Code Playgroud) 我完全相信一个有效的R程序应该尽可能避免使用循环,而应该使用apply函数的大系列.但如果没有痛苦,这是不可能的.例如,我面临一个问题,其解决方案涉及应用函数中的总和,因此结果列表减少到单个值,这不是我想要的.具体来说,我会尽量简化我的问题N =100
sapply(list(1:N), function(n) (
choose(n,(floor(n/2)+1):n) *
eps^((floor(n/2)+1):n) *
(1- eps)^(n-((floor(n/2)+1):n))))
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,内部函数会导致构建向量的长度爆炸,而使用内部求和会将所有内容折叠为单值
sapply(list(1:N), function(n) (
choose(n,(floor(n/2)+1):n) *
eps^((floor(n/2)+1):n) *
(1- eps)^(n-((floor(n/2)+1):n))))
Run Code Online (Sandbox Code Playgroud)
我想要的是一个N的程度列表.那你觉得怎么样?我该怎么修呢?
我想重新生成一个生成data.frames的循环.这是我正在寻找的一般想法的[错误]循环.
for (i in 1:2){
a <- c(2, (i+10))
b <- c((i+10)), 5))
c[i] <- data.frame(a,b)
}
rbind(c)
Run Code Online (Sandbox Code Playgroud)
我想要一个像这样的输出:
2 11
11 5
2 12
12 5
Run Code Online (Sandbox Code Playgroud)
之前已经问过这个问题,但答案是一个直接的解决方案,没有任何解释.我不知道怎么读.它涉及do.call和mget.