如何在R中按日期以cbind方式合并含缺失数据的两组数据集
用R合并两个带缺失数据的数据集(按日期时间匹配)
首先得明确:cbind()在这里并不适用——它是单纯按行的位置绑定列,而你的两个数据集行不对应(数据集2缺少3/1/01和4/1/01的记录),强行用cbind会导致数据完全错位,根本达不到按日期匹配的效果。
正确的做法是用merge()函数,它能根据指定的匹配键(这里是Date和time)对齐两个数据集,自动处理缺失行,把匹配到的heatlost和weight列插入到数据集1中,缺失的位置会用NA填充,正好符合你的需求。
具体步骤:
1. 先把你的数据转换成R数据框
先模拟读入你给出的两个数据集:
# 数据集1 df1 <- data.frame( Date = c("1/1/01", "2/1/01", "3/1/01", "4/1/01", "5/1/01", "6/1/01", "7/1/01"), time = c("0300", "0800", "0300", "0600", "0800", "0300", "0800"), Range = c("31km", "30km", "33km", "32km", "28km", "35km", "31km"), Waterconsumption = c("2.0liters", "1.8liters", "1.7liters", "1.8liters", "1.7liters", "1.6liters", "1.8liters"), stringsAsFactors = FALSE ) # 数据集2 df2 <- data.frame( Date = c("1/1/01", "2/1/01", "5/1/01", "6/1/01", "7/1/01"), time = c("0300", "0800", "0800", "0300", "0800"), heatlost = c(0.27, 0.33, 0.69, 0.15, 0.63), weight = c("61.5kg", "62.0kg", "61.7kg", "61.8kg", "62.0kg"), stringsAsFactors = FALSE )
2. 使用merge()按日期时间匹配合并
指定by = c("Date", "time")作为匹配键,设置all.x = TRUE来保留数据集1的所有行,只匹配数据集2中对应的记录:
merged_df <- merge(df1, df2, by = c("Date", "time"), all.x = TRUE)
3. 查看合并结果
运行后得到的merged_df就是你想要的格式:
print(merged_df) #> Date time Range Waterconsumption heatlost weight #> 1 1/1/01 0300 31km 2.0liters 0.27 61.5kg #> 2 2/1/01 0800 30km 1.8liters 0.33 62.0kg #> 3 3/1/01 0300 33km 1.7liters <NA> <NA> #> 4 4/1/01 0600 32km 1.8liters <NA> <NA> #> 5 5/1/01 0800 28km 1.7liters 0.69 61.7kg #> 6 6/1/01 0300 35km 1.6liters 0.15 61.8kg #> 7 7/1/01 0800 31km 1.8liters 0.63 62.0kg
可以看到heatlost和weight已经正确插入到Waterconsumption列之后,缺失的记录用NA填充,完全符合你的需求。
为什么不能用cbind()?
再强调一次:cbind()只看行的位置,不管内容是否匹配。比如它会把数据集2的第3行(5/1/01的记录)绑定到数据集1的第3行(3/1/01的记录),直接导致数据错位,这显然不是你想要的结果。
内容的提问来源于stack exchange,提问作者MT32
相关产品推荐
相关产品推荐

