【问题标题】:R Convert loop into functionR将循环转换为函数
【发布时间】:2020-11-02 05:54:00
【问题描述】:

我想稍微清理一下我的代码,并开始在我的日常计算中使用更多函数(我通常会使用 for 循环)。我有一个 for 循环的例子,我想把它变成一个函数。我遇到的问题是如何在没有循环的情况下逐步通过约束向量。这就是我的意思;

## 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”向量值的部分是我遇到的问题。如何在一个函数中从 frm[1] 到 frm[2].. 等等(应用或其他方式)?

任何建议将不胜感激。

谢谢。

【问题讨论】:

    标签: r function for-loop apply


    【解决方案1】:

    您可以编写一个函数,该函数返回特定范围列的每一行中最小值的列名。我使用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))
    

    【讨论】:

      猜你喜欢
      • 2020-06-03
      • 2011-03-25
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多