2014-01-17 2 views
0

У меня есть два набора данных, AAPL и AMZN, что я желаю двух слияний, но мне трудно сделать так, чтобы cbind не мог сделать то, что я хочу. Я считаю, что проблемы распознают наборы данных как data.frames, но не уверены.Как объединить данные запаса из двух разных наборов?

Данные выглядит следующим образом:

 Date Time Open High Low Close Volume 
1 12/14/12 9:30 514.75 515.10 512.72 512.86 2504264 
2 12/14/12 9:31 512.80 513.00 510.00 510.17 574498 
3 12/14/12 9:32 510.04 511.70 509.11 511.26 673126 
4 12/14/12 9:33 511.26 511.54 508.82 509.25 477914 
5 12/14/12 9:34 509.03 510.65 508.50 510.54 432689 

Желаемый результат:

Date Time Open High Low Close Volume 
12/14/12 9:30 250.11 250.64 250.07 250.37 38249 
12/14/12 9:31 250.60 250.60 250.16 250.51 6954 
12/14/12 9:32 250.47 250.72 250.43 250.72 3843 
12/14/12 9:33 250.69 250.70 250.44 250.50 3990 
12/14/12 9:34 250.46 250.64 250.21 250.31 4490 

    Date Time Open High Low Close Volume 
12/14/12 9:31 512.80 513.00 510.00 510.17 574498 
12/14/12 9:32 510.04 511.70 509.11 511.26 673126 
12/14/12 9:33 511.26 511.54 508.82 509.25 477914 
12/14/12 9:34 509.03 510.65 508.50 510.54 432689 

По сути, я хочу, чтобы объединить два набора данных по Date и Timeбок о бок (I не мог этого сделать здесь). Я попытался преобразовать каждый набор данных xts, но не уверен, если это правильно:

AAPL <- read.csv("aapl1.csv",header=TRUE) 
AMZN <- read.csv("amzn1.csv",header=TRUE) 
aapl <- xts(AAPL[,c(3:7)], AAPL$DATETIME <-as.POSIXct(paste(AAPL$Date,AAPL$Time), format=""%m/%d/%Y %H:%M")) 
amzn <- xts(AMZN[,c(3:7)], AMZN$DATETIME <-as.POSIXct(paste(AMZN$Date,AMZN$Time), format=""%m/%d/%Y %H:%M")) 

Затем он не может слиться, когда я использую cbind, merge или даже join.

+0

Просьба сделать это воспроизводимым, предоставив краткие примеры наборов данных в вопросе. –

+0

@MatthewLundberg Я привел короткий пример данных ... В данных отображаются разные столбцы для 'Date' и' Time'. – Jason

+0

Напишите пример таким образом, чтобы его можно было вставить в интерпретатор. То, как это считывается в объект 'xts', очень важно. –

ответ

1

Вторая альтернатива join() из plyr пакета , Он имеет некоторые преимущества по сравнению с merge(), но также предоставляет меньше вариантов. Было бы полезно для очень больших наборов данных, потому что оно быстрее, чем merge().

require(plyr) 
join(AAPL, AMZN, by = c("Date", "Time")) 
+0

спасибо, это был именно то, что я искал, простой и быстрый метод – Jason

2

Если ваши объекты xts индексируются по дате (как и должно быть), просто передайте два набора для слияния. Здесь я буду объединять набор с собой, так как ваш вопрос не имеет пример данных:

data(sample_matrix) 
sample.xts <- as.xts(head(sample_matrix), descr='my new xts object') # From ?xts 

merge(sample.xts, sample.xts) 
##    Open  High  Low Close Open.1 High.1 Low.1 Close.1 
## 2007-01-02 50.03978 50.11778 49.95041 50.11778 50.03978 50.11778 49.95041 50.11778 
## 2007-01-03 50.23050 50.42188 50.23050 50.39767 50.23050 50.42188 50.23050 50.39767 
## 2007-01-04 50.42096 50.42096 50.26414 50.33236 50.42096 50.42096 50.26414 50.33236 
## 2007-01-05 50.37347 50.37347 50.22103 50.33459 50.37347 50.37347 50.22103 50.33459 
## 2007-01-06 50.24433 50.24433 50.11121 50.18112 50.24433 50.24433 50.11121 50.18112 
## 2007-01-07 50.13211 50.21561 49.99185 49.99185 50.13211 50.21561 49.99185 49.99185 

Это работает, потому что merge вызовы merge.xts этих данных.

Слияние ваших данных образца без использования xts. Во-первых, давайте прочитаем их в интерпретатор:

AAPL <- read.table(header=T, text='Date Time Open High Low Close Volume 
12/14/12 9:30 250.11 250.64 250.07 250.37 38249 
12/14/12 9:31 250.60 250.60 250.16 250.51 6954 
12/14/12 9:32 250.47 250.72 250.43 250.72 3843 
12/14/12 9:33 250.69 250.70 250.44 250.50 3990 
12/14/12 9:34 250.46 250.64 250.21 250.31 4490') 

AMZN <- read.table(header=T, text='Date Time Open High Low Close Volume 
12/14/12 9:31 512.80 513.00 510.00 510.17 574498 
12/14/12 9:32 510.04 511.70 509.11 511.26 673126 
12/14/12 9:33 511.26 511.54 508.82 509.25 477914 
12/14/12 9:34 509.03 510.65 508.50 510.54 432689') 

Это теперь объекты класса data.frame и могут быть объединены на Date и Time столбцов:

merge(AAPL, AMZN, by=c('Date', 'Time'), all=T, suffixes = c('.AAPL', '.AMZN')) 
##  Date Time Open.AAPL High.AAPL Low.AAPL Close.AAPL Volume.AAPL Open.AMZN High.AMZN Low.AMZN Close.AMZN Volume.AMZN 
## 1 12/14/12 9:30 250.11 250.64 250.07  250.37  38249  NA  NA  NA   NA   NA 
## 2 12/14/12 9:31 250.60 250.60 250.16  250.51  6954 512.80 513.00 510.00  510.17  574498 
## 3 12/14/12 9:32 250.47 250.72 250.43  250.72  3843 510.04 511.70 509.11  511.26  673126 
## 4 12/14/12 9:33 250.69 250.70 250.44  250.50  3990 511.26 511.54 508.82  509.25  477914 
## 5 12/14/12 9:34 250.46 250.64 250.21  250.31  4490 509.03 510.65 508.50  510.54  432689 
+0

Да, это то, что я искал, но 'join()' кажется более быстрым способом, чем 'merge()' спасибо за помощь мне – Jason

1

Преобразование в XTS и использование merge будет работать, как только вы исправить несколько проблем в вашем коде.

AAPL <- read.csv("aapl1.csv",header=TRUE) 
AMZN <- read.csv("amzn1.csv",header=TRUE) 
# your code is easier to understand if you create these columns outside of the 
# xts constructor. Note that your `format` was incorrect. You need %y 
# (2-digit year), not %Y (4-digit year). You also had unmatched quotes. 
AAPL$DATETIME <- as.POSIXct(paste(AAPL$Date,AAPL$Time), format="%m/%d/%y %H:%M") 
AMZN$DATETIME <- as.POSIXct(paste(AMZN$Date,AMZN$Time), format="%m/%d/%y %H:%M") 
# create xts objects and merge 
aapl <- xts(AAPL[,c(3:7)], AAPL$DATETIME) 
amzn <- xts(AMZN[,c(3:7)], AMZN$DATETIME) 
aapl.amzn <- merge(aapl,amzn) 
+0

Thanks @JoshuaUlrich для указания проблем с моим кодом. – Jason

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