Хотите написать цикл для поиска значений коэффициента отражения для каждого столбца

#r #loops #for-loop

#r #циклы #for-цикл

Вопрос:

Итак, у меня есть этот код в R, который я использую для фрейма данных df, который поставляется в формате, где каждая строка представляет собой длину волны (823 строки / длины волны), а каждый столбец представляет собой пиксель (записывается как V1-V2554).

Изображение набора данных здесь.

У меня есть код для нормализации каждого значения коэффициента отражения как такового для каждого спектра / пикселя:

 # Define function to find vector length
veclen=function(vec) {
    sqrt(sum(vec^2))
}
# Find vector length for spectrum of each pixel
df_vecV6 <- df %>%
              group_by(Wavelength) %>%
              summarise(veclengthV6 =  veclen(V6))
            
# Join new variable "veclength"
df <- df %>%
      left_join(df_vecV6, by = "Wavelength")
            
# Define function that return normalized vector
vecnorm=function(vector) {
          vector/veclen(vector)
}
# Normalize by dividing each reflectance value by the vector’s length
df$refl_normV6 <- vecnorm(df$V6)
          
 

но я хочу создать цикл, чтобы сделать это для всех 2553 столбцов. Я начал писать его, но, похоже, возникли проблемы. В этом случае df является finaldatat, и я хотел создать список svec для хранения длин векторов перед следующими шагами:

 for(i in (1:ncol(finaldatat))){
  svec[[i]]<- finaldatat %>% 
    #group_by(Wavelength) %>% 
    summarise (x = veclen(finaldatat[,i]))
}
 

Этот первый шаг выполняется, но длины векторов, которые должны быть ниже нуля, намного выше, поэтому я уже знаю, что есть проблема. Любая помощь приветствуется!

В идеале в конечном фрейме данных у меня были бы только нормализованные результаты в том же формате 2554×824.

Комментарии:

1. Пожалуйста, предоставьте примерные данные, вставив выходные dput(df) данные (или dput(head(df)) ) и не показывайте изображение ваших данных, спасибо

2. Хорошее эмпирическое правило при написании R-кода: «Если вы думаете об использовании цикла, вероятно, есть лучший способ». Это определенно один из таких случаев. Я бы посмотрел на across функцию в dplyr или аналогичные параметры. Смотрите здесь , Например.

Ответ №1:

Вы можете использовать dplyr across функцию ‘s для применения vecnorm ко всем столбцам от V1 до V2554 .

 result <- df %>%
            group_by(Wavelength) %>%
            summarise(across(V1:V2554, vecnorm))
            #In older version of dplyr use summarise_at : 
            summarise_at(vars(V1:V2554), vecnorm)