我正在尝试合并两个相对较大的数据集。我正在通过 SiteID 进行合并 - 这是位置和日期/时间的唯一指标,由年、月 = 月、日和小时 = 小时组成。
问题是在merge
某处丢弃数据。最小值、最大值、平均值和中值都发生了变化,当它们应该是相同的数据时,只需合并即可。我已将数据转换为字符并检查字符串是否匹配,但仍然丢失数据。我也试过left_join
了,但这似乎没有帮助。请参阅下面的更多细节。
编辑:合并正在删除数据,因为每个("SiteID", "Year","Mo","Day", "Hr")
. 因此,我需要dB
在合并之前插入缺失值(请参阅下面的答案)。
结束编辑
请参阅页面底部的链接以重现此示例。
PC17$Mo<-as.character(PC17$Mo)
PC17$Year<-as.character(PC17$Year)
PC17$Day<-as.character(PC17$Day)
PC17$Hr<-as.character(PC17$Hr)
PC17$SiteID<-as.character(PC17$SiteID)
dB$Mo<-as.character(dB$Mo)
dB$Year<-as.character(dB$Year)
dB$Day<-as.character(dB$Day)
dB$Hr<-as.character(dB$Hr)
dB$SiteID<-as.character(dB$SiteID)
# confirm that data are stored as characters
str(PC17)
str(dB)
现在来比较我的SiteID
值,我使用 unique 来查看我有哪些字符串,并setdiff
查看 R 是否将任何字符串识别为缺失。每个站点都缺少一个站点ID,但这没关系,因为数据中确实缺少它(不是字符串问题)。
sort(unique(PC17$SiteID))
sort(unique(dB$SiteID))
setdiff(PC17$SiteID, dB$SiteID) ## TR2U is the only one missing, this is ok
setdiff(dB$SiteID, PC17$SiteID) ## FI7D is the only one missing, this is ok
现在,当我查看数据(按 SiteID 总结)时,它看起来像是一个不错的完整数据框——这意味着我拥有每个站点的数据,我应该拥有。
library(dplyr)
dB %>%
group_by(SiteID) %>%
summarise(
min_dBL50=min(dbAL050, na.rm=TRUE),
max_dBL50=max(dbAL050, na.rm=TRUE),
mean_dBL50=mean(dbAL050, na.rm=TRUE),
med_dBL50=median(dbAL050, na.rm=TRUE)
)
# A tibble: 59 x 5
SiteID min_dBL50 max_dBL50 mean_dBL50 med_dBL50
<chr> <dbl> <dbl> <dbl> <dbl>
1 CU1D 35.3 57.3 47.0 47.6
2 CU1M 33.7 66.8 58.6 60.8
3 CU1U 31.4 55.9 43.1 43.3
4 CU2D 40 58.3 45.3 45.2
5 CU2M 32.4 55.8 41.6 41.3
6 CU2U 31.4 58.1 43.9 42.6
7 CU3D 40.6 59.5 48.4 48.5
8 CU3M 35.8 75.5 65.9 69.3
9 CU3U 40.9 59.2 46.6 46.2
10 CU4D 36.6 49.1 43.6 43.4
# ... with 49 more rows
在这里,我合并两个数据集 PC17 和 dB,方法是"SiteID", "Year","Mo","Day", "Hr"
- 保留所有 PC17 值(即使它们没有与之匹配的 dB 值;all.x=TRUE
)。
但是,当我查看这些数据的摘要时,现在所有的SiteID
值都有不同的值,并且某些站点完全缺失,例如“CU3D”和“CU4D”。
PCdB<-(merge(PC17, dB, by=c("SiteID", "Year","Mo","Day", "Hr"), all.x=TRUE))
PCdB %>%
group_by(SiteID) %>%
summarise(
min_dBL50=min(dbAL050, na.rm=TRUE),
max_dBL50=max(dbAL050, na.rm=TRUE),
mean_dBL50=mean(dbAL050, na.rm=TRUE),
med_dBL50=median(dbAL050, na.rm=TRUE)
)
# A tibble: 59 x 5
SiteID min_dBL50 max_dBL50 mean_dBL50 med_dBL50
<chr> <dbl> <dbl> <dbl> <dbl>
1 CU1D 47.2 54 52.3 54
2 CU1M 35.4 63 49.2 49.2
3 CU1U 35.3 35.3 35.3 35.3
4 CU2D 42.3 42.3 42.3 42.3
5 CU2M 43.1 43.2 43.1 43.1
6 CU2U 43.7 43.7 43.7 43.7
7 CU3D Inf -Inf NaN NA
8 CU3M 44.1 71.2 57.6 57.6
9 CU3U 45 45 45 45
10 CU4D Inf -Inf NaN NA
# ... with 49 more rows
我将所有内容都设置as.character()
为第一行中的字符。此外,我已经检查了Year
, Day
, Mo
, andHr
和setdiff
,unique
就像我在上面对所做的SiteID
那样,这些字符串不匹配似乎没有任何问题。
我也尝试过合并数据集的dplyr
功能left_join
,但并没有什么不同。