[英]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.