Я пытаюсь объединить два относительно больших набора данных.Я объединяюсь по SiteID - это уникальный показатель местоположения и даты / времени, которые включают год, месяц = мо, день и час = час.
Проблема в том, что merge
куда-то сбрасывает данные.Минимальные, максимальные, средние и медианные значения все изменяются, когда они должны быть одинаковыми данными, просто объединяются.Я преобразовал данные в символы и проверил, совпадают ли строки символов, но я все еще теряю данные.Я тоже пробовал left_join
, но это не помогает.Подробнее см. Ниже.
РЕДАКТИРОВАТЬ: Слияние отбрасывает данные, потому что данные не существуют для каждого ("SiteID", "Year","Mo","Day", "Hr")
.Итак, мне нужно было интерполировать пропущенные значения из dB
, прежде чем я смог объединиться (см. Ответ ниже). END EDIT
см. Ссылку внизу страницы, чтобы воспроизвести этот пример.
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
значения, я использую уникальные, чтобы увидеть, какие строки символов у меня есть, и setdiff
, чтобы увидеть, распознает ли R какие-либо как отсутствующие.Один siteID отсутствует в каждом, но это нормально, потому что он действительно отсутствует в данных (не проблема символьной строки).
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 и дБ на "SiteID", "Year","Mo","Day", "Hr"
- сохраняя все значения PC17(даже если у них нет значений в дБ, чтобы идти с ним; 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
и Hr
с setdiff
и unique
так же, как я делал выше с SiteID
, и, похоже, никаких проблем сэти строки символов не совпадают.
Я также попытался dplyr
function left_join
объединить наборы данных, и это не имело никакого значения.
Я попытался создать воспроизводимый пример dput
, но, похоже, что вопрос в вопросе StackOverflow не понравился, насколько он был большим, а копирование и вставка этого вывода dput в мой RStudio привели к сбою, поэтому явместо этого разместил данные и скрипт здесь: https://github.com/dgomes50/SO_merge