Jestem nowy do programowania R i doceniałbym pomoc.

Pracuję z pakietem Edarwebrom, ale myślę, że moje pytanie jest ogólne pytanie programowe.

Muszę utworzyć ramę danych zawierającą informacje o formularzach 10-K.

Funkcje, których używam, to firma_filings i filal_filers.

apple_filings = company_filings("0000320193", type = "10-K", page = 1000 )

Pierwszym wejściem jest identyfikator firmy o nazwie CIK.

Powyższy kod zwraca ramkę danych, w której każdy wiersz jest szczegółami składania 10K przez Apple Inc., w tym link do strony internetowej SEC dla każdego zgłoszenia.

Następnie mogę korzystać z tego linku jako wejście dla plików zgłoszeń, aby uzyskać informacje o Apple w tym konkretnym roku, który jest moim celem końcowym:

filing_filers("web_address_from_company_filings")

Muszę napisać kod, który przechodzi przez różne firmy i zwraca ramkę danych, w której każdy wiersz jest wyprowadzany z filmu_filers dla konkretnej firmy w określonym roku.

Napisałem następujący kod:

# cik_sample is a char vector of my firm identifiers
cik_sample = c("0001438823","0000320193","0000018230" )

for (j in cik_sample){
    c_filings = company_filings(j, type = "10-K",count = 1000  )
    row_num = nrow(c_filings)

# in case the cik doesn't return anything:  
    if (row_num == 0){
        next
    }
#keep what I need
    c_filings_short = select(c_filings, filing_date, href, type)
# store the links, which I need for filing_filers function  
    c_hrefs <- as.data.frame(c_filings_short[,2])
#setting up for the loop
    c_length = length(c_hrefs)
    c_index = (1:c_length)

# creating an empty data frame to be filled in with loop  
# name the variable using cik identifier
    nam <- paste("cik_", j,sep="")
    assign(nam, data.frame(matrix(ncol =21, nrow = c_length )))  

    for (i in c_index) { 
        nam[i,] <- filing_filers(as.character(c_hrefs[i,1]))
    }
}

Mój problem jest z ostatnią pętlę. Daje mi błąd:

Error in nam[i, ] <- filing_filers(as.character(c_hrefs[i, 1])) : 
  incorrect number of subscripts on matrix

Kodeks poprawnie tworzy CIK_0000320193 i myślę, że rozumiem, dlaczego zmienna Nam jest postacią, a nie rama danych, a dlatego, że w funkcji przypisania Nam jest tylko symbolem zastępczym. Ale nie wiem, co robić, aby wypełnić pusty CIK_XXXXXXXXXX w każdej iteracji. Czy możesz także pomóż mi dołączyć wszystkie ramki danych razem w jednej dużej ramie danych zawierających dane z Al Companies?

Ponieważ jestem bardzo nowy do r, musiałem uciekać się do pisania kilku pętli. Nie wiem, czy istnieje bardziej wydajne sposoby, aby to zrobić.

r
0
jayjunior 30 grudzień 2019, 09:36

1 odpowiedź

Najlepsza odpowiedź

Jest kilka problemów:

  1. Nazwy pakietów rozróżniane są wielkość liter, więc upewnij się, aby przeliterować nazwę pakietu, jak pokazano poniżej.

  2. Zwykle jest niepożądany, aby utworzyć zestaw powiązanych zmiennych pływających luźno w swoim obszarze roboczym, ale raczej korzystne jest utworzenie listy, aby utrzymać je wszystkie za pomocą {x1}} lub Map, aby utworzyć listę.

  3. nam to ciąg znaków, a oświadczenie {X1}} próbuje zaawansować ciąg znaków tak, jakby był ramą danych. Obiekt utworzony w assign ma nazwę, taką jak cik_0000320193, a nie nam. Jeśli naprawdę chciałeś przypisać do tego obiektu, byłoby .GlobalEnv[[nam]][i, ] <- ...; Jednak będziemy kontynuować (2) powyżej.

Najpierw utwórz funkcję get10K, aby uzyskać zgłoszenia dla jednego CIK, a następnie użyć Map, aby zastosować go do każdego CIK. Wreszcie użyj Filter, aby usunąć puste elementy. Daje to listę ramek danych.

library(edgarWebR)

get10K <- function(cik) {
  c_filings <- company_filings(cik, type = "10-K", count = 1000  )
  cbind(do.call("rbind", lapply(c_filings$href, filing_filers)), 
    filing_date = c_filings$filing_date)
}

res <- Filter(length, Map(get10K, cik_sample))
0
G. Grothendieck 31 grudzień 2019, 00:29