2017-11-26 3 views
0

Hallo, ich habe derzeit 70 Blätter unter der gleichen Excel-Arbeitsmappe und ich versuche tägliche Rücksendungen basierend auf den Daten zu finden und dann alle 70 Blätter in einem Datenrahmen zusammenzuführen. Alle 70 Blätter enthalten Datum und Eröffnungskurs. Hier ist mein Code so weit für die Software RTägliche Retouren in R für mehrere Arbeitsblätter in derselben Arbeitsmappe suchen und zusammenführen?

require(XLConnect) 
wb <- loadWorkbook(system.file("crypto.xlsx", package = "XLConnect")) 
crypto = readWorksheet(wb, sheet = getSheets(wb),startRow=1,endRow = 20, endCol=2) 

Ich möchte kehrt jedes Blatt zu finden und dann alle 70 in einem Datenrahmen verschmelzen. Allerdings ist der Zeitraum in all diesen Tabellen unterschiedlich und ich finde keine Möglichkeit, sie zusammenzuführen. Im Final Datenframe möchte ich die Variablen Date, Price1, Dailyreturn1, Price2, DailyReturn2 ......... Price70, DailyReturn70 Jede Hilfe würde mit Rückgaben und Zusammenführen geschätzt werden.

So sehen meine Daten mit viel mehr Zeilen aus und das Datenformat ist für alle 70 Blatt gleich.

Date  Open  High Low Close Market Cap 
28-Apr-13 135.3  135.98 132.1 134.21 1,500,520,000 
29-Apr-13 134.44  147.49 134 144.54 1,491,160,000 
30-Apr-13 144   146.93 134.05 139  1,597,780,000 
1-May-13 139   139.89 107.72 116.99 1,542,820,000 

und ich möchte das Endergebnis in etwa so aussehen mit allen 70 Blatt in einem. DR ist für den täglichen Rendite

Date Open1 DR1 Open2 DR2 Open3 DR3............Open70 DR70 
+0

Was ist * Preis * oder * DailyReturn *? Bitte versuchen Sie Ihre Ausgabe auf einem Blatt. – Parfait

+0

Tägliche Rückkehr ist nur eine einfache Rückkehr basierend auf dem offenen Preis. –

+0

Sie haben zwei gewünschte Ergebnisse. Und wieder hast du irgendeinen Versuch unternommen nach 'krypto ...'? – Parfait

Antwort

0

die Kette fusionieren Betrachten mit Reduce alle x Reihen zu halten (das heißt, an der linken Seite). Aber erste Update-Liste zum Umbenennen von Spalten, die in einem lapply mit setNames getan werden kann.

# ASSUME ALL DFs ARE ONLY Date and Open 
crypto2 <- lapply(seq_along(crypto), function(i) 
    setNames(crypto[[i]], c("Date", paste0("DR", i)))) 

finaldf <- Reduce(function(x, y) merge(x, y, by="Date", all.x=TRUE), crypto2) 

HINWEIS: Seien Sie sehr vorsichtig mit diesem Reduce Ansatz, wenn Ihre Daten doppelte Termine mit verschiedenen öffnen Werte haben wie die merge groß schnell wachsen wird, da jede Kombination zurückgegeben werden kommen.

Beispiel mit zufälligen Daten (Aggregat verwendet nur einmalige Termine pro oben Warnung zurückzukehren)

set.seed(123) 

crypto <- lapply(seq(10), function(i) 
    aggregate(Open~Date, data.frame(
    Date = Sys.Date()- sapply(seq(30), function(i) sample(15,1,replace=TRUE)), 
    Open = abs(rnorm(30)*100) 
), FUN=max)) 

crypto2 <- lapply(seq_along(crypto), function(i) 
    setNames(crypto[[i]], c("Date", paste0("DR", i)))) 

finaldf <- Reduce(function(x, y) merge(x, y, by="Date", all.x=TRUE), crypto2) 

Ausgabe

finaldf 
#   Date  DR1  DR2  DR3  DR4  DR5  DR6  DR7  DR8  DR9  DR10 
# 1 2017-11-12 70.92008 56.29895 37.56029 136.403745 100.56363  NA 138.80490 28.73408 64.75134 195.07210 
# 2 2017-11-13 102.55714 212.84519 190.23618 199.274849 127.22668  NA 151.60676  NA 188.63252 90.35164 
# 3 2017-11-15 44.82098 105.27115 135.98407 101.755864 123.56935 123.66758 107.49451  NA 91.35660 45.73573 
# 4 2017-11-16 22.04866 36.89645 63.07541 151.921771 43.88187 103.96804 168.75895 144.14618 90.44355  NA 
# 5 2017-11-17 122.07177 37.45809 229.30790 175.323736 88.33028 35.88557 84.90611 72.82191 23.11149 70.10036 
# 6 2017-11-18 109.68390  NA 159.85088 62.418747 163.35684 116.52534 154.66092 90.42150 33.33700 79.76007 
# 7 2017-11-19 205.00847  NA 78.86220 246.589819  NA 60.85572  NA 245.80605 85.52022 184.32663 
# 8 2017-11-20 114.88076 37.24388 154.75811 72.160444 71.27033 60.53707 107.4.88494 131.82207 76.46060 
# 9 2017-11-21 33.32074 126.01552 50.21987 257.145815 222.49877 50.63335 208.67174 106.10953 115.29362 148.37795 
# 10 2017-11-22 230.91689 21.53805 11.36399 97.400958 239.74525 96.72673  NA 58.99827 216.14158 122.09637 
# 11 2017-11-24 33.17820 104.91770 66.47694   NA 45.03386 142.05655 260.16997 154.04424  NA 103.81310 
# 12 2017-11-25 37.96395 97.69734 52.11173 57.185006 163.63793 18.43089 141.52819 154.77765 65.80102 109.95509 
# 13 2017-11-26 37.06600 76.90422 175.65274 3.303616 177.95029 194.58512 87.52555 118.71868 39.43948 111.64164 
+0

Ja, es hat jetzt funktioniert, ich habe alle offenen Preise für alle Währungen in einem Datenrahmen wie in dem Beispiel, das Sie angegeben haben. Ich habe noch einen Schritt vor mir, mit dem ich Probleme habe. Ich möchte eine Formel für alle DR1 bis DR70 für die tägliche Rückkehr anwenden. Zum Beispiel wird die Formel, die ich basierend auf den Beispieldaten anwenden möchte, aussehen wie (102.55714-70.92008) /70.92008, aber es wird alle Daten von DR1 bis DR70 abdecken. Jede Hilfe würde auf diesem –

+0

geschätzt werden Technisch sollte das eine neue Frage sein, wie es sich über diesen Titel und Post hinaus erstreckt. Und schau in Rs "Diff". Stellen Sie sicher, dass Sie diese Frage im StackOverflow-Modus mit [Danke] (https://meta.stackexchange.com/a/5235) schließen. – Parfait

+0

ok ich werde das dank tun –

Verwandte Themen