R Преобразовать l oop в функцию - PullRequest
0 голосов
/ 13 июля 2020

Я хотел бы немного очистить свой код и начать использовать больше функций для своих повседневных вычислений (где я обычно использовал бы циклы for). У меня есть пример для l oop, который я хотел бы превратить в функцию. Проблема, с которой я столкнулся, заключается в том, как пройти через векторы ограничений без al oop. Вот что я имею в виду:

## 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 от frm [1] до frm [2] .. и т.д. в функции (применить или иначе)?

Любые советы будут очень признательны.

Спасибо ты.

1 Ответ

1 голос
/ 13 июля 2020

Вы можете написать функцию, которая возвращает имя столбца с минимальным значением в каждой строке для определенного диапазона столбцов. Я использовал max.col вместо apply(df, 1, which.min), чтобы получить минимальное значение в строке, поскольку max.col будет более эффективным по сравнению с apply.

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...