terra::as.data.frame处理多图层时的命名问题:如何保留原图层名?
解决Terra包多图层转数据框时列名重复的问题
核心原因
出现重复的lyr.1列名,是因为创建的rast对象默认图层名为lyr.1,合并后两个图层同名,转数据框时就会出现重复列名。要保留原对象名作为列名,关键是提前给每个rast对象设置自定义图层名。
解决方案:设置自定义图层名
方法1:创建rast时直接指定图层名
library(terra) m <- matrix(1:25, nrow=5, ncol=5) rm <- rast(m, names = "rm") # 创建时指定图层名为原对象名 n <- matrix(rep(5,time=25),nrow = 5,ncol = 5) rn <- rast(n, names = "rn") dt <- c(rm,rn) data <- terra::as.data.frame(dt, xy=TRUE) head(data)
方法2:事后修改已有rast对象的图层名
如果已经创建好rast对象,可通过names()函数修改:
library(terra) m <- matrix(1:25, nrow=5, ncol=5) rm <- rast(m) n <- matrix(rep(5,time=25),nrow = 5,ncol = 5) rn <- rast(n) names(rm) <- "rm" # 修改图层名 names(rn) <- "rn" dt <- c(rm,rn) data <- terra::as.data.frame(dt, xy=TRUE) head(data)
最终输出
两种方法都会得到列名正确的结果:
> head(data) x y rm rn 1 0.5 4.5 1 5 2 1.5 4.5 6 5 3 2.5 4.5 11 5 4 3.5 4.5 16 5 5 4.5 4.5 21 5 6 0.5 3.5 2 5
批量处理技巧(多图层场景)
如果需要合并多个rast对象,可通过列表批量设置图层名:
# 将rast对象存入命名列表 r_list <- list(rm = rm, rn = rn) # 批量设置图层名为列表的键名 r_list <- lapply(names(r_list), function(nm) { r <- r_list[[nm]] names(r) <- nm r }) # 合并所有图层 dt <- do.call(c, r_list) # 转数据框 data <- as.data.frame(dt, xy=TRUE)
内容的提问来源于stack exchange,提问作者Breeze
相关产品推荐
相关产品推荐

