簡體   English   中英

R 將循環轉換為 function

[英]R Convert loop into function

我想稍微清理一下我的代碼,並開始在我的日常計算中使用更多函數(我通常會使用 for 循環)。 我有一個 for 循環的例子,我想把它做成 function。 我遇到的問題是如何在沒有循環的情況下逐步通過約束向量。 這就是我的意思;

## represents spectral data
set.seed(11)
df <- data.frame(Sample = 1:100, replicate(1000, sample(0:1000, 100, rep = TRUE)))

## feature ranges by column number
frm <- c(438,563,953,963)
to <- c(548,803,1000,993)
nm <- c("WL890", "WL1080", "WL1400", "WL1375")

WL.ps <- list()

for (i in 1:length(frm)){
  
  ## finds the minimum value within the range constraints and returns the corresponding column name  
  WL <- colnames(df[frm[i]:to[i]])[apply(df[frm[i]:to[i]],1,which.min)]
  
  WL.ps[[i]] <- WL
}

new.df <- data.frame(WL.ps)
colnames(new.df) <- nm

我遍歷“frm”和“to”向量值的部分是我遇到的問題。 一個 go 如何在 function 中從 frm[1] 到 frm[2].. 等等(應用或其他方式)?

任何建議將不勝感激。

謝謝你。

您可以編寫一個 function ,它返回特定列范圍的每一行中最小值的列名。 我使用max.col而不是apply(df, 1, which.min)來連續獲得最小值,因為max.colapply相比會更有效。

apply_fun <- function(data, x, y) {
   cols <- x:y
   names(data[cols])[max.col(-data[cols])]
}

使用Map

WL.ps <- Map(apply_fun, frm, to, MoreArgs = list(data = df))

暫無
暫無

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

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