如何拆分CHR类型列、透视气象数据后与LST数据表按日期合并?
问题根源
你当前的气象长表是按气象变量堆叠的长结构,同一日期对应7行数据(分别对应温度、风速等7个气象指标),直接和LST表按Date合并会导致LST每条数据重复7次,无法得到每个气象指标作为独立列的结果。
另外注意如果你的气象长表没有设置正确列名,需要先执行列名赋值:
colnames(weather_long) <- c("Weather_variable", "Date", "Value")
解决方案
方法1:tidyverse语法(推荐,适配你已经用到的pivot系列函数)
library(tidyverse) # 把气象长表转为日期为行、每个气象变量为独立列的宽结构 weather_wide <- weather_long %>% pivot_wider(names_from = Weather_variable, values_from = Value) # 按日期左连接LST表,保留LST所有行 data_long <- LST_data %>% left_join(weather_wide, by = "Date")
方法2:基础R语法
如果你偏好使用merge函数,可按如下步骤操作:
# 把气象长表转为宽格式 weather_wide <- reshape(weather_long, idvar = "Date", timevar = "Weather_variable", direction = "wide") # 清理列名,去掉默认生成的前缀 colnames(weather_wide) <- gsub("Value\\.", "", colnames(weather_wide)) # 按日期合并两个表,all.x=TRUE代表保留LST所有行 data_long <- merge(LST_data, weather_wide, by = "Date", all.x = TRUE)
注意事项
- 合并前请确认两个表的
Date字段格式完全一致:比如日期字符串的分隔符、前导零(比如07/05/2010不要写成7/5/2010),避免因字符串不匹配导致关联不到值 - 如果你是从原始气象宽表开始处理,可以直接从宽表转成上述需要的
weather_wide结构,不需要先转成长表再转宽表,减少操作步骤:weather_wide <- weather_raw %>% pivot_longer(cols = -`Weather variable`, names_to = "Date", values_to = "value") %>% pivot_wider(names_from = `Weather variable`, values_from = value)
内容的提问来源于stack exchange,提问作者strangecharm
相关产品推荐
相关产品推荐

