2016-05-13 2 views
0

Я пытаюсь завершить dataframe, который имеет пробелы. Данные строятся ежечасно, и есть несколько переходов между часами. Это образец dataframe:Заполнить пробелы путем слияния с DataFrame, который является полным?

sms <- read.csv("hoursms2.csv", sep = ";", header = FALSE) 
sms$date <- strptime(sms$date,"%d/%m/%Y %H:%M") 

date      count 

2015-12-17 22:00:00  5 
2015-12-18 09:00:00  7 
2015-12-18 10:00:00  3 
2015-12-18 12:00:00  6 

То, что я пытался это создать еще одну dataframe которая колеблется от начала до конца первого dataframe, но со всеми часами и с уникальным идентификатором, чтобы сохранить трек из него:

hh <- seq(min(sms$date), max(sms$date), by="hour") 
hh <- as.data.frame(hh) 
hh <- cbind(hh,seq(1:3292)) #length of the hh data frame 

что дает следующее:

date      id 
2015-12-04 12:00:00  1 
2015-12-04 13:00:00  2 
2015-12-04 14:00:00  3 
2015-12-04 15:00:00  4 
2015-12-04 16:00:00  5 

до сих пор я попробовал эти три вещи, которые я нашел на StackOverflow, here, но они не работает в этом случае:

res <- merge(sms,hh,by = "date", all = TRUE) 
res2 <- res[duplicated(res$date), ] 
res3 <- res[!duplicated(res), ] 

Первый вводе команды, разрешения, что делает это, чтобы дублировать все клетки, не сливаться его по дате, так что это дает следующее:

2015-12-23 19:00:00  5 
2015-12-23 19:00:00  NA 

Другой все испортит. Я думаю, что это имеет какое-то отношение к формату даты, который неправильно связан, но не уверен. Любое предложение о том, как заполнить по датам мой кадр данных, пожалуйста?

+0

Одним из способов является использование 'left_join()' из пакета 'dplyr'. Вы делаете 'left_join (hh, sms)', и это должно дать вам то, что вы хотите, я думаю. – Gopala

+0

@Gopala Просто попробовал и дал следующую ошибку: Присоединение: «date» Ошибка: не удается присоединиться к дате столбцов «x» date »: не удается присоединиться к« дате »x« дате »из-за несовместимых типов (POSIXct, POSIXt/POSIXlt, POSIXt) – adrian1121

ответ

1

Используя библиотеку dplyr, сделайте следующее, убедившись, что у вас есть соответствующие типы в обоих кадрах данных.

Вот как настроить кадры два данных:

str(sms) 
'data.frame': 4 obs. of 2 variables: 
$ date : POSIXct, format: "2015-12-17 22:00:00" "2015-12-18 09:00:00" "2015-12-18 10:00:00" ... 
$ count: int 5 7 3 6 
str(hh) 
'data.frame': 15 obs. of 2 variables: 
$ date: POSIXct, format: "2015-12-17 22:00:00" "2015-12-17 23:00:00" "2015-12-18 00:00:00" ... 
$ id : int 1 2 3 4 5 6 7 8 9 10 ... 

Вот левый присоединиться код:

library(dplyr) 
left_join(hh, sms) 
Joining by: "date" 
        date id count 
1 2015-12-17 22:00:00 1  5 
2 2015-12-17 23:00:00 2 NA 
3 2015-12-18 00:00:00 3 NA 
4 2015-12-18 01:00:00 4 NA 
5 2015-12-18 02:00:00 5 NA 
6 2015-12-18 03:00:00 6 NA 
7 2015-12-18 04:00:00 7 NA 
8 2015-12-18 05:00:00 8 NA 
9 2015-12-18 06:00:00 9 NA 
10 2015-12-18 07:00:00 10 NA 
11 2015-12-18 08:00:00 11 NA 
12 2015-12-18 09:00:00 12  7 
13 2015-12-18 10:00:00 13  3 
14 2015-12-18 11:00:00 14 NA 
15 2015-12-18 12:00:00 15  6 

Примечание: Я должен был преобразовать имя столбца в hh к date, как код, о котором идет речь, не делает этого. В качестве альтернативы вы можете указать параметр by в вызове left_join.

+0

большое спасибо! Проблема действительно была в формате даты! – adrian1121

Смежные вопросы