You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 18:28:15