0 Daumen
658 Aufrufe

Ich möchte die Unterschiede zwischen Zellen in einem Datenrahmen einer Spalte berechnen.

 

   > head(df_benchmark)
            Date .STOXXR
    1 2000-01-03  478.52
    2 2000-01-04  459.53
    3 2000-01-05  448.19
    4 2000-01-06  446.24
    5 2000-01-07  455.80
    6 2000-01-10  462.97
The data file is [here][1].

Also habe ich folgendes versucht:


    df_benchmark <- read.xlsx("Data.xlsx", sheet = "Benchmark", startRow = 2,colNames = TRUE, detectDates = TRUE, skipEmptyRows = FALSE)
    df_benchmark[2] <- data.matrix(df_benchmark[2])
   
    > library(lubridate)
    > percent_change2 <- function(x)last(x)/first(x) - 1
    > monthly_return_benchmark <- df_benchmark %>%
    +  group_by(gr = floor_date(Date, unit = "month")) %>%
    +  summarize_at(vars(-Date, -gr), percent_change2) %>%
    +  ungroup() %>%
    +  select(-gr) %>%
    +  as.matrix()


Trotzdem habe ich einen Fehler. Es scheint, dass mein Datenrahmen mit einer Datumsspalte und einer Wertespalte ein 1d-Atomvektor oder eine Liste sein muss. Es scheint, dass der Grund ein Problem von Variablen ist:
    Error: Each variable must be a 1d atomic vector or list.
    Problem variables: '.STOXXR'

# Noch ein Versuch

df_benchmark[2] <- data.matrix(df_benchmark[2]). Dies wurde verwendet, weil ich ein Formatproblem hatte.

Also habe ich folgenden Code ausprobiert:


    library(xts)
    df_benchmark <- read.xlsx("Data.xlsx", sheet = "Benchmark", startRow = 2,colNames = TRUE, detectDates = TRUE, skipEmptyRows = FALSE)
   
    percent_change2 <- function(x) last(x)/first(x) - 1
    monthly_return_benchmark <- df_benchmark %>%
      group_by(gr = floor_date(as_date(Date), unit = "month")) %>%
      summarize_at(vars(-Date, -gr), percent_change2) %>%
      ungroup()
   
    # Wir generieren die xts und geben die Spalte mit den Zeitangaben an
    monthly_return_benchmark <- xts(monthly_return[,-1], order.by=monthly_return$gr)

   
Ich hatte aber folgenden Fehler:


    > library(xts)
    > df_benchmark <- read.xlsx("Data.xlsx", sheet = "Benchmark", startRow = 2,colNames = TRUE, detectDates = TRUE, skipEmptyRows = FALSE)
    >
    > percent_change2 <- function(x) last(x)/first(x) - 1
    > monthly_return_benchmark <- df_benchmark %>%
    +  group_by(gr = floor_date(as_date(Date), unit = "month")) %>%
    +  summarize_at(vars(-Date, -gr), percent_change2) %>%
    +  ungroup()
    Error in eval(substitute(expr), envir, enclos) :
      non-numeric argument to binary operator




# Dritter Versuch

Nur durch die Verwendung von group_by unter Verwendung der Monate als Einheiten erhalte ich Folgendes:


    > monthly_return_benchmark <- df_benchmark %>% 
    +    group_by(gr = floor_date(Date, unit = "month"))
    > monthly_return_benchmark
    Source: local data frame [4,604 x 3]
    Groups: gr [216]
   
            Date .STOXXR        gr
          <date>  <chr>    <date>
    1  2000-01-03  478.52 2000-01-01
    2  2000-01-04  459.53 2000-01-01
    3  2000-01-05  448.19 2000-01-01
    4  2000-01-06  446.24 2000-01-01
    5  2000-01-07  455.8 2000-01-01
    6  2000-01-10  462.97 2000-01-01
    7  2000-01-11  459.85 2000-01-01
    8  2000-01-12  459.84 2000-01-01
    9  2000-01-13  462.27 2000-01-01
    10 2000-01-14  473.43 2000-01-01
    # ... with 4,594 more rows


Jetzt muss ich das percent_change2 machen, aber es hat nie funktioniert.


  [1]: https://docs.google.com/spreadsheets/d/1MExW-r0NNGAlMxlQh_tjOscpm6xBiMsfMKRPQykJgr8/edit?usp=sharing
  [2]: https://stackoverflow.com/a/55401086/4764604

Avatar von

1 Antwort

0 Daumen

Antwort mit KI erzeugt

Problemverständnis:

Du möchtest die monatlichen Veränderungen (Renditen) einer spezifischen Spalte (Wertespalte) in einem DataFrame berechnen. Dein Ansatz nutzt die R-Paketfunktionalität von dplyr und lubridate für die Gruppierung und Berechnung. Allerdings begegnest du einigen Herausforderungen, darunter ein Fehler, der auftritt, wenn du versuchst, die prozentuale Veränderung mit deinem benutzerdefinierten percent_change2-Funktion zu berechnen.

Hier ist eine Schritt-für-Schritt-Lösung, die auf deinem letzten Versuch basiert, und wie du damit die gewünschte Berechnung ohne Fehler durchführen kannst:

Schritt 1: Daten Vorbereitung

Es scheint, als ob die Datenspalte korrekt interpretiert wird, aber es gibt ein Problem mit der Typzuweisung der Spalte .STOXXR. Statt der Konvertierung der gesamten Spalte in eine Matrix mit data.matrix(), solltest du sicherstellen, dass die Spalte .STOXXR als numerisch behandelt wird. Dies ist notwendig, da arithmetische Operationen auf nicht-numerischen Typen (z.B. Faktor oder Zeichenketten) nicht zulässig sind.

r
library(readxl)
library(lubridate)
library(dplyr)

# Lese Daten ein (ersetze 'Data.xlsx' mit deinem tatsächlichen Dateipfad)
df_benchmark <- read_excel("Data.xlsx", sheet = "Benchmark", startRow = 2, colNames = TRUE, detectDates = TRUE, skipEmptyRows = FALSE)

# Stelle sicher, dass .STOXXR als numerisch behandelt wird
df_benchmark$.STOXXR <- as.numeric(as.character(df_benchmark$.STOXXR))


Schritt 2: Prozentuale Veränderung Berechnung

Die Funktion percent_change2 scheint korrekt definiert zu sein. Das Problem könnte jedoch daran liegen, dass die summarize_at-Funktion nicht die erwarteten Daten als Argument für deine benutzerdefinierte Funktion liefert. Statt summarize_at könntest du eine Kombination aus mutate() und lag() verwenden, um die prozentuale Veränderung direkt zu berechnen.

r
df_benchmark <- df_benchmark %>%
  mutate(Date = as.Date(Date)) %>%  # Stelle sicher, dass das Datum als Datumstyp interpretiert wird
  arrange(Date) %>%  # Sortiere Daten nach Datum
  group_by(gr = floor_date(Date, unit = "month")) %>%
  mutate(PercentChange = (.STOXXR - lag(.STOXXR)) / lag(.STOXXR)) %>%
  ungroup() %>%
  select(-gr)

# Überprüfe die Ergebnisse
print(head(df_benchmark))


In diesem Beispiel berechnet mutate eine neue Spalte PercentChange, die die prozentuale Veränderung zum vorherigen Wert darstellt. lag(.STOXXR) wird verwendet, um den Wert der vorherigen Zeile in der gleichen Spalte zu erhalten. Beachte, dass der erste Wert in jeder Gruppe NA sein wird, weil es keinen vorherigen Wert gibt, von dem die Veränderung berechnet werden könnte.

Dieser Ansatz sollte die monatliche prozentuale Veränderung für deinen Datenrahmen ohne die zuvor erlebten Fehler berechnen.
Avatar von

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community