#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)