避免双重'循环功能

时间:2018-03-07 14:57:44

标签: r

我有以下功能:

v <- function(r){
    for(i in 2:length(df$v1)){
    df$v1[i] <- 1/((1+r)^(i-1))
  }
    for(i in 3:length(df$v2)){
    df$v2[i] <- 1/((1+r)^(i-2))
  }
  df
}

当我为预定义的data.frame&#39; df&#39;运行函数(i = .25)时有两列长度为9的列(v1和v2),我得到了所需的输出:

        v1        v2 
1  0.0000000 0.0000000
2  0.8000000 0.0000000
3  0.6400000 0.8000000
4  0.5120000 0.6400000
5  0.4096000 0.5120000
6  0.3276800 0.4096000
7  0.2621440 0.3276800
8  0.2097152 0.2621440 
9  0.1677722 0.2097152

我需要为包含更多列的data.frame运行此函数。我可以设想在这个例子中创建一个for循环:

for(k in 2:3){
  for(i in k:length(df[1]) etc...
 }
}

但是我想知道是否有更快的方法来组合原始v函数中的语句,这样就不会有两个单独的&#39; for&#39;声明也不是双重的声明。循环是必要的。

2 个答案:

答案 0 :(得分:1)

您可以在不使用任何循环的情况下使用sapply

my.fct.1 <- function(x,r){return(1/(1+r)^(x-1))}
df$v1 <- my.fct.1(1:length(df$v1), r)

然后类似于df$v2

my.fct.2 <- function(x,r){return(1/(1+r)^(x-2))}
df$v2 <- my.fct.2(1:length(df$v2), r)

修改

如果您有多列,则可能需要考虑以下内容

my.fct <- function(x,k,r){return(1/(1+r)^(x-k))}
df <- t(sapply(X = 1:dim(df)[1], FUN = my.fct, k = 1:dim(df)[2], r = r))

答案 1 :(得分:1)

您可以使用v2来定义v1,以防止进行两次计算。只需使用以下内容更改函数中的第二个for循环。

df$v2 <- c(0, df$v1[1:(nrow(df)-1)])