我有以下功能:
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;声明也不是双重的声明。循环是必要的。
答案 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)])