【问题标题】:Want to write a loop to find reflectance values for each column想写一个循环来查找每列的反射率值
【发布时间】: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

标签: r loops for-loop


【解决方案1】:

您可以使用dplyracross 函数将vecnorm 应用于从V1V2554 的所有列。

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

【讨论】:

    猜你喜欢
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    相关资源
    最近更新 更多