【发布时间】:2020-11-24 07:14:10
【问题描述】:
因此,我在 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]))
}
第一步运行,但是应该低于零的向量长度远远高于所以我已经知道有问题。任何帮助表示赞赏!
理想情况下,在最终数据帧中,我只会获得相同 2554x824 格式的标准化结果。
【问题讨论】:
-
请通过粘贴
dput(df)(或dput(head(df)))的输出提供示例数据,不要显示您的数据图片,谢谢 -
编写 R 代码时的一个好的经验法则是“如果您正在考虑使用循环,那么可能有更好的方法”。这绝对是一个这样的案例。我会查看
dplyr或类似选项中的across函数。例如,请参阅here。