如何在R语言中将纬度(行)×经度(列)的数据框转换为纬度(列1)、经度(列2)、数值(列3)的数据框?
嘿,这个需求太常见啦——就是把宽格式的地理温度数据转成长格式的三列结构(lat、lon、temp),我给你三个实用的R解决方案,覆盖不同场景:
先构造一个和你描述一致的示例数据
先模拟一个符合你需求的测试数据框,方便你直接跑代码:
set.seed(123) # 固定随机数,方便复现 temp_df <- data.frame( "100.1" = rnorm(4, 20, 2), # 列是经度值 "100.2" = rnorm(4, 20, 2), "100.3" = rnorm(4, 20, 2), row.names = c("30.1", "30.2", "30.3", "30.4") # 行是纬度值 ) # 给列名加个lon前缀(如果你的原始数据列名就是纯经度,这步可以跳过) colnames(temp_df) <- paste0("lon_", colnames(temp_df))
方法1:用tidyverse的pivot_longer(推荐,语法最清晰)
这是目前R里最流行的数据重塑方式,代码可读性拉满,适合大多数场景:
library(tidyverse) temp_long <- temp_df %>% # 第一步:把行名(纬度)转成单独的列 rownames_to_column(var = "lat") %>% # 第二步:把所有经度列转成长格式,提取经度值和对应温度 pivot_longer( cols = starts_with("lon_"), # 选择所有经度相关的列 names_to = "lon", # 新列名:经度 values_to = "temp", # 新列名:温度 names_prefix = "lon_" # 去掉列名里的lon_前缀,得到真实经度值 ) # 查看结果 print(temp_long)
如果你的原始列名就是纯经度(没有lon_前缀),直接把names_prefix参数删掉就行。
方法2:基础R的reshape函数(不用装额外包)
如果你不想加载第三方包,用基础R自带的reshape也能搞定:
# 先把行名转成纬度列 temp_df_with_lat <- cbind(lat = rownames(temp_df), temp_df) rownames(temp_df_with_lat) <- NULL # 去掉自动生成的行名 # 转成长期格式 temp_long_base <- reshape( temp_df_with_lat, direction = "long", varying = colnames(temp_df), # 指定要转换的经度列 v.names = "temp", # 温度值的列名 timevar = "lon", # 经度的列名 times = colnames(temp_df), # 经度的取值 idvar = "lat" # 按纬度分组 ) # 去掉经度列的前缀(如果需要) temp_long_base$lon <- gsub("lon_", "", temp_long_base$lon) # 重置行名(可选) rownames(temp_long_base) <- NULL print(temp_long_base)
方法3:用data.table的melt(适合超大数据集)
如果你的数据量特别大(比如几万行/列),data.table的速度会比tidyverse快很多:
library(data.table) # 把数据框转成data.table,同时把行名转成纬度列 temp_dt <- as.data.table(temp_df, keep.rownames = "lat") # 重塑成长期格式 temp_long_dt <- melt( temp_dt, id.vars = "lat", # 保留纬度列 variable.name = "lon", # 经度列的名称 value.name = "temp" # 温度列的名称 ) # 去掉经度列的前缀(如果需要) temp_long_dt[, lon := gsub("lon_", "", lon)] print(temp_long_dt)
额外小提示
- 所有方法都会保留原始数据里的NA值,如果想删除NA行,在tidyverse里可以加
filter(!is.na(temp)),基础R用na.omit(temp_long_base),data.table用temp_long_dt[!is.na(temp)] - 如果你的纬度/经度是数值类型,最后可以用
as.numeric()把lat和lon列转成数值,方便后续地理分析
内容的提问来源于stack exchange,提问作者Jamie_B
相关产品推荐
相关产品推荐

