簡體   English   中英

在R函數中使用for循環

[英]Using for loops within functions in R

目標:獲取帶有標題的data.frame並返回一個新的data.frame,其中包含從函數內的計算創建的其他變量。

我現有的代碼可用於創建data.frame的轉換:

transform<- function(x) {
  transformtemp<- x
  transformtemp[1]<- x[1]
  for(i in 2:length(x)) {
    transformtemp[i]<- x[i] + 0.9*transformtemp[i-1]
  }
  transformscale<- sum(x)/sum(transformtemp)
  x<- transfomrtemp*transformscale
}

x[]<- lapply(x,transform)

通過此代碼,我獲得了一個data.frame,該函數已應用於我的數據的所有列。

我需要幫助:1.到目前為止,此代碼僅將0.9用作我的衰減參數。 我想使用更多的衰減參數來創建輸出,例如衰減<-seq(0,1,0.1)並保存以供使用。 2.我希望輸出為原始數據加上數據的新列,並以不同的衰減率應用函數,其名稱為“ column1_0.9”,“ column1_0.8”,“ column2_0.9”等。

我嘗試使用衰減率不斷變化的另一個循環,但似乎無法正確處理。 我希望這一切都有道理,如果需要進一步澄清,請告訴我。

一切順利,謝謝!

您無需分配原始數據即可運行:

mytransform<- function(x) {
  transformtemp<- x
  transformtemp[1]<- x[1]
  for(i in 2:length(x)) {
    transformtemp[i]<- x[i] + 0.9*transformtemp[i-1]
  }
  transformscale<- sum(x)/sum(transformtemp)
  x<- transformtemp*transformscale
}

A <- do.call(data.frame, lapply(mtcars,mytransform))

讓我們通過filter功能提高效率:

mytransform1 <- function(x, d) {
  y <- filter(x, d, sides=1, method="recursive")

  transformscale<- sum(x)/sum(y)
  c(y*transformscale)
}

B <- do.call(data.frame, lapply(mtcars, mytransform1, d=0.9))

all.equal(A, B)
#[1] TRUE

現在,我們通過一個附加的sapply循環添加了對多種衰減率的支持:

mytransform <- function(x, d) {
  y <- sapply(d, function(d, x) c(filter(x, d, sides=1, method="recursive")), x=x)
  transformscale<- sum(x)/colSums(y)
  t(t(y)*transformscale)
}
C <- do.call(data.frame, lapply(mtcars, mytransform, d=c(0.9, 0.8)))
all.equal(B, setNames(C[,seq_along(B)*2-1], names(B)))
#[1] TRUE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM