Как удалить объекты из списка в R и соединить их внутри, не умножая строки?

#r #list #inner-join #quantmod

Вопрос:

Я использую R и библиотеку quantmod для импорта данных в виде:

 getSymbols("TMUS",from="2020-05-21", src="yahoo",frequency = "daily", format = "%Y-%m-%d") 
getSymbols("AAPL",from="2020-05-21", src="yahoo",frequency = "daily", format = "%Y-%m-%d") 
 

а затем я хочу вывести их из списка и указать им столбец с датой:

 TMUS<- as.vector(unlist(TMUS$TMUS.Close)) %>% as_tibble() %>% add_column(date=index(TMUS),.before=1)
AAPL<- as.vector(unlist(AAPL$AAPL.Close)) %>% as_tibble() %>% add_column(date=index(AAPL),.before=1)
 

и, наконец, внутренне присоединяйтесь к ним, чтобы создать уникальную базу данных:

 data <- TMUS %>%
        inner_join(.,AAPL, by = "date")
 

Проблема в том, что внутреннее соединение умножает количество строк. Я считаю, что причина в том, что оба TMUS и AAPL являются списками. Я попытался удалить их с помощью as.vector(unlist(.)) , но они все еще являются списками.

Есть ли способ получить внутреннее объединение набора данных без умножения строк?

Комментарии:

1. Пожалуйста, подтвердите, что вы также используете zoo .

2. На самом деле я не использую zoo, но я предполагаю, что он может быть импортирован quantmod

3. Опечатка: index(APPL) ?

4. Исправлено, спасибо!

5. Здесь ничего list нет , все они "data.frame" (из getSymbols ) или c("tbl_df","tbl","data.frame") (из вашего as.vector(...) потока). Когда я бегу inner_join , я начинаю с 253 строк в каждой и заканчиваю всего 253 строками, я не вижу вашего «умножения строк» . ( inner_join работает только с data.frame подобными объектами, включая тибблы, он не будет работать с векторами, поэтому unlist(.) не подходит для использования.)

Ответ №1:

Попробуйте выполнить следующее (или используйте объявление вместо Cl, если вы хотите скорректировать закрытие). AAPL , TMUS и both будут объектами xts. Если вам нужны только даты, для которых есть данные в обеих сериях, используйте na.omit(both) .

 library(quantmod)

getSymbols(c("AAPL", "TMUS"))
both <- cbind(Cl(AAPL), Cl(TMUS))
 

Если у вас много акций, попробуйте этот подход:

 getSymbols(c("AAPL", "TMUS"), env = e <- new.env())
both <- do.call("cbind", eapply(e, Cl))