0 Daumen
643 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

Ein anderes Problem?

Stell deine Frage

Ähnliche Fragen

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community