【问题标题】:compute mean of selected columns in a list of sf objects and store the values in a data frame计算 sf 对象列表中选定列的平均值并将值存储在数据框中
【发布时间】:2021-07-08 00:11:44
【问题描述】:

假设我有一个sf 对象列表,我想计算所选列的平均值。之后,我想将这些值存储在新数据框中的单独列中。样本数据可以从here下载。以下是我到目前为止所做的。如何解决这个问题?

 # Now make a list of two sample shapefiles "a" and "b"
myfiles = list.files(path = "~",
                     pattern=".shp$", full.names = TRUE)

# Read each shapefile and return a list of sf objects
listOfShp = lapply(myfiles, st_read)
 
# First make an empty df
time.series = data.frame()
# Start a loop
for (i in listOfShp){
  time.series$Mean.Z = data.frame(mean(i$z)) 
  time.series$Intensity.mean = data.frame(mean(i$V4))
}


Error in `$<-.data.frame`(`*tmp*`, "Mean.Z", value = list(mean.i.z. = -4.19655105979791)) : 
  replacement has 1 row, data has 0

【问题讨论】:

    标签: r spatial sf


    【解决方案1】:

    您似乎正在尝试将数据框分配为条目而不是值。你可能想要的是这样的:

    time.series <-
      listOfShp %>%
      purrr::map_df(
        function(df_) {
          data.frame(
            Mean.Z = mean(df_$z),
            Intensity.mean = mean(df_$V4)
          )
        }
      )
    

    此解决方案迭代 listOfShp。对于列表中的每个 shapefile 数据框,它应用创建具有两列的数据框的函数。在为列表中的每个元素创建数据框后,它将它们绑定到一个数据框中。

    带有文件名的更优雅的解决方案可能是:

    
    # Function that takes as an input a file name and outputs some facts about the
    # dataframe:
    describe_shapefile <- function(shp_path) {
      sf_df <- st_read(shp_path) %>%
        st_set_geometry(NULL)
      mean_z = mean(sf_df$z)
      int_mean = mean(sf_df$V4)
      data.frame(
        filename = shp_path,
        Mean.Z = mean_z,
        Intensity.mean = int_mean
      )
    }
    
    # Apply the function to each file in the list
    myfiles %>%
      purrr::map_df(describe_shapefile)
    

    【讨论】:

    • 这会返回一个错误 Error in [[&lt;-(*tmp*, i, value = data.frame(Mean.Z = mean(i$z), Intensity.mean = mean(i$V4 ))) : 无效的下标类型“列表”
    • 啊,我的错误。修改了上面的代码来解决这个问题。我最初试图使用 i 作为列表的索引。我只是用来自 tidyvers 的 purrr 用一个完全整洁的解决方案替换它。
    • 在单独的注释中,您的第三个 shapefile 似乎没有前两个具有的所有列。
    • 是的,第三个文件只是研究区域边界多边形,在这种情况下不需要。谢谢你,代码现在可以正常工作了。我只需要将 myfiles %>% purrr::map_df(describe_shapefile) 存储在一个变量中,以便将新数据框存储在全局环境中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2016-03-03
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多