如何删除 for 循环并对数据帧变量执行矢量化?
How to remove the for loop and perform vectorization for data frame variables?
我有一个包含 6 个变量的数据框 (V6Stationary42Obs1D.df)。对于我的数据框的第一个变量,我获得了如下值(effrectpl[i,1] 中的“1”表示我获得了第一个变量的值):
sum <- 0
for (i in as.integer(1:5)) { # 5= no. of variables - 1 = 6-1=5
sum <- sum + conditionalGb(as.matrix(V6Stationary42Obs1D.df[gctemplate(6,1,1)[effrectpl[i,1],]][(1+0):42,]), nx = 1, ny = 1, order = 5)[[2]]
}
sum
对于我的数据框的第二个变量,我获得了如下值(effrectpl[i,2] 中的“2”表示我获得了第二个变量的值):
sum <- 0
for (i in as.integer(1:5)) {
sum <- sum + conditionalGb(as.matrix(V6Stationary42Obs1D.df[gctemplate(6,1,1)[effrectpl[i,2],]][(1+0):42,]), nx = 1, ny = 1, order = 5)[[2]]
} # "6" in gctemplate(6,1,1) is the no. of variables in the data frame
# there is no change other than the one in effrectpl[i,2] for the 2nd variable
sum
我的数据变量中有 6 个变量,我必须对每个变量做同样的事情(当我将这个质量转换为函数时,变量的数量会改变;值得注意的是,对于神经科学,有时可能会有大约 300变量!并猜测计算负载)。我需要一个矢量化解决方案来解决上述问题。
我做了什么(想):
sum <- c(0,0,0,0,0,0)
for (i in as.integer(1:5)) {
sum??? <- sum + ????
}
sum
虽然我知道 s/t/...apply family,但在这个特定问题中我也不知道如何处理它们。
任何帮助将不胜感激。提前致谢。
注意:我发现了以下 for-inside-for 解决方案,现在,认为在上述情况下,矢量化解决方案可能很困难或不必要。无论如何,如果我看到某种非 for 解决方案,我会很高兴。
for (j in as.integer(1:6)) {
sum[j] <- 0
for (i in as.integer(1:5)) {
sum[j] <- sum[j] + conditionalGb(as.matrix(V6Stationary42Obs1D.df[gctemplate(6,1,1)[effrectpl[i,j],]][(1+0):42,]), nx = 1, ny = 1, order = 5)[[2]]
}
print(sum[j])
}
如果您不关心计算速度并且您了解自己在做什么,那么 for 循环就可以了。它没有错。它可以通过矢量化变得更有效率,但这不是必需的。
很难为您提供解决方案,因为该示例很难理解并调用了我不知道它在做什么的函数,但一般来说,如果您有一个函数 f(i) 取决于我你可以转
sum = 0
for( i in 1:n) sum = sum + f(i)
进入
sum(sapply(1:n,function(i) f(i)))
顺便说一句,调用变量 sum 是个坏主意,因为它也是 R 中常用函数的名称。
我有一个包含 6 个变量的数据框 (V6Stationary42Obs1D.df)。对于我的数据框的第一个变量,我获得了如下值(effrectpl[i,1] 中的“1”表示我获得了第一个变量的值):
sum <- 0
for (i in as.integer(1:5)) { # 5= no. of variables - 1 = 6-1=5
sum <- sum + conditionalGb(as.matrix(V6Stationary42Obs1D.df[gctemplate(6,1,1)[effrectpl[i,1],]][(1+0):42,]), nx = 1, ny = 1, order = 5)[[2]]
}
sum
对于我的数据框的第二个变量,我获得了如下值(effrectpl[i,2] 中的“2”表示我获得了第二个变量的值):
sum <- 0
for (i in as.integer(1:5)) {
sum <- sum + conditionalGb(as.matrix(V6Stationary42Obs1D.df[gctemplate(6,1,1)[effrectpl[i,2],]][(1+0):42,]), nx = 1, ny = 1, order = 5)[[2]]
} # "6" in gctemplate(6,1,1) is the no. of variables in the data frame
# there is no change other than the one in effrectpl[i,2] for the 2nd variable
sum
我的数据变量中有 6 个变量,我必须对每个变量做同样的事情(当我将这个质量转换为函数时,变量的数量会改变;值得注意的是,对于神经科学,有时可能会有大约 300变量!并猜测计算负载)。我需要一个矢量化解决方案来解决上述问题。
我做了什么(想):
sum <- c(0,0,0,0,0,0)
for (i in as.integer(1:5)) {
sum??? <- sum + ????
}
sum
虽然我知道 s/t/...apply family,但在这个特定问题中我也不知道如何处理它们。
任何帮助将不胜感激。提前致谢。
注意:我发现了以下 for-inside-for 解决方案,现在,认为在上述情况下,矢量化解决方案可能很困难或不必要。无论如何,如果我看到某种非 for 解决方案,我会很高兴。
for (j in as.integer(1:6)) {
sum[j] <- 0
for (i in as.integer(1:5)) {
sum[j] <- sum[j] + conditionalGb(as.matrix(V6Stationary42Obs1D.df[gctemplate(6,1,1)[effrectpl[i,j],]][(1+0):42,]), nx = 1, ny = 1, order = 5)[[2]]
}
print(sum[j])
}
如果您不关心计算速度并且您了解自己在做什么,那么 for 循环就可以了。它没有错。它可以通过矢量化变得更有效率,但这不是必需的。
很难为您提供解决方案,因为该示例很难理解并调用了我不知道它在做什么的函数,但一般来说,如果您有一个函数 f(i) 取决于我你可以转
sum = 0
for( i in 1:n) sum = sum + f(i)
进入
sum(sapply(1:n,function(i) f(i)))
顺便说一句,调用变量 sum 是个坏主意,因为它也是 R 中常用函数的名称。