Я пытаюсь извлечь данные каждой компании из некоторых бесплатных наборов данных NASDAQ 100 Twitter, доступных здесь. Конечной целью после создания и курирования является проведение некоторых экспериментов по моделированию с фреймом данных. Основная форма данных, к которой я стремлюсь:
ATVI 49.02 0.44 0.91 7193022 .3
ADBE 119.91 0.31 0.26 1984225 .1
AKAM 64.2 0.65 1.02 1336622 .1
ALXN 126.55 0.86 0.67 2182253 .2
GOOG 838.68 3.31 0.4 1261517 1.0
AMZN 853 2.5 0.29 2048187 1.0
Для каждой компании есть шесть файлов .xlsx (разархивированных в отдельные каталоги), каждый файл Excel с несколькими рабочими листами внутри. Сейчас я просто пытаюсь извлечь первый рабочий лист из каждой из шести электронных таблиц Excel для каждой компании. Все эти рабочие листы имеют два столбца с разным количеством строк, а метки данных находятся в разных строках, например. файл 1, компания 1:
Keyword $AAPL -
Total tweets 166631
Total audience 221363515
Contributors 42738
Original tweets 91614
Replies 4964
RTs 70053
Images and links 43361
файл 2, компания 1:
Keyword $AAPL -
Total audience 221363515
Contributors 42738
Total tweets 166631
Total potential impressions 1.250.920.501
Measured data from 2016-04-02 18:06
Measured data to 2016-06-15 12:23
Tweets per contributor 3,90
Impressions / Audience 5,65
Measured time in seconds 6373058
Measured time in minutes 106218
Measured time in hours 1770
Measured time in days 74
Tweets per second 0.026146161
Tweets per minute 1.568769655
Tweets per hour 94.1261793
Tweets per day 2259.028303
Я пытаюсь реализовать readxl
, как это предлагается в этом post, а затем поместите данные каждой компании в строку фрейма данных [ниже]. Прямо сейчас я устанавливаю первый путь в качестве своего каталога, а затем запускаю код, затем устанавливаю второй путь и запускаю его снова, чтобы добавить новую строку (я знаю, что это не оптимально, см. ниже).
library(readxl)
#create empty dataframe to assemble all the rows
cdf <- data.frame()
#setwd('...\\NASDAQ_100\\aal_2016_06_15> cdf data frame with 0 columns and 0 rows
01_41')
#setwd('...\\NASDAQ_100\\aapl_2016_06_15_14_30_09')
#constructing list of all .xlsx files in current directory
file.list <- list.files(pattern='*.xlsx')
#using read_excel function to read each file in list and put in a dataframe of lists
df.list <- lapply(file.list, read_excel)
#converting the dataframe of lists to a 77x2 dataframe
df <- as.data.frame(do.call(rbind, df.list),stringsAsFactors=FALSE)
#transposing the dataframe to prepare to stack multiple companies data in single dataframe
df <- t(df)
#making sure that the dataframe entry values are numeric
df <- transform(df,as.numeric)
#appending the 2nd row with the actual data into the dataframe that will have all companies' data
cdf <- rbind(cdf,df[2,])
Пример вывода:
> cdf[,1:8]
X1 X2 X3 X4 X5 X6 X7 X8
$AAL 6507 14432722 1645 5211 459 837 938 14432722
$AAPL - 166631 221363515 42738 91614 4964 70053 43361 221363515
После проверки я обнаружил, что в моих столбцах есть уровни, которые я собрал из разных других сообщений, из-за того, как я импортировал данные, и поэтому я пытался добавить stringsAsFactors=FALSE
к as.data.frame
, но ясно, что это не решение:
> cdf[,2]
$AAL $AAPL -
14432722 221363515
Levels: 14432722 Total audience 221363515
Согласно документации, это не аргумент для read_excel
. Есть ли способ по-прежнему использовать его, но избегать этих уровней?
Как только я разобрался с этим, я надеюсь получить это в базовом цикле for для просмотра всех разархивированных подкаталогов:
dir.list <- list.dirs(recursive = F)
for (subdir in dir.list) {
file.list <- list.files(pattern='*.xlsx')
df.list <- lapply(file.list, read_excel)
df <- as.data.frame(do.call(rbind, df.list),stringsAsFactors=FALSE)
df <- t(df)
df <- transform(df,as.numeric)
cdf <- rbind(cdf,df[2,])
}
Но это дает > cdf data frame with 0 columns and 0 rows
? Я знаю, что ни один из кодов не является элегантным или компактным (и что rbind не рекомендуется в циклах for), но это то, что мне удалось собрать воедино. Я очень восприимчив к исправлениям стиля и альтернативным методам, но было бы очень полезно, если бы их контекст был объяснен в рамках общей проблемы/решения, описанного здесь (т.е.: не просто «использовать пакет xyz» или «прочитать ldply() документацию").
Спасибо,