2016-06-07 16 views
0

Ich habe einen großen Datensatz in einem langen Datenrahmen gespeichert. Ich möchte Daten über einige Variablen extrahieren und eine Formel verwenden, um neue Daten zu generieren. Alle notwendigen Informationen sollten aus der Formel extrahiert werden. Zuerst möchte ich die Informationen in der Formel verwenden, um das Dataset für die entsprechenden Variablen zu filtern - dazu verwende ich die Funktion all.vars(). Ich verlasse mich auch auf das formula.tools Paket, das auf CRAN ist. Es dient zur einfachen Extraktion der linken und rechten Seite der Gleichung (lhs bzw. rhs).Lassen Sie dplyr mutieren Formel verwenden

library(dplyr) 
library(reshape2) 
library(formula.tools) 

set.seed(100) 

the_data <- data.frame(country = c(rep("USA", 9), rep("DEU", 9), rep("CHN", 9)), 
         year = c(2000, 2010, 2020), 
         variable = c(rep("GDP", 3), rep("Population", 3), rep("Consumption", 3)), 
         value = rnorm(27, 100, 100)) 

add_variable <- function(df, equation){ 
    df <- filter(df, variable %in% all.vars(equation)) 

    df <- dcast(df, country + year ~ variable) 

    df <- mutate_(df, rhs(equation)) 

    # code to keep only the newly generated column 
    # ... 

    df <- melt(df, id.vars = c("country", "year")) 
} 

result <- add_variable(the_data, GDPpC ~ GDP/Population) 

Die neu generierte Spalte sollte GDPpC genannt werden, zur Zeit es GDP/Population genannt wird. Wie kann das verbessert werden? In einem letzten Schritt möchte ich auch die Daten so filtern, dass nur die neu erzeugten Daten im Ergebnis enthalten sind, die dann über rbind an den Quelldatenrahmen angehängt werden können.

+2

Schwer zu sagen, was Ihre Frage ist –

+0

Danke, Sie haben Recht. Ich habe versucht, das zu verbessern. – roming

Antwort

1

Wäre das eine Lösung?

add_variable <- function(df, equation){ 
     df <- filter(df, variable %in% all.vars(equation)) 
     orig_vars <- unique(df$variable) 
     df <- dcast(df, country + year ~ variable) 

     df <- mutate_(df, rhs(equation)) 
     colnames(df)[ncol(df)] <- as.character(lhs(equation)) 

     df <- melt(df, id.vars = c("country", "year")) 
     df <- filter(df, !variable%in%orig_vars) 
    } 

    result <- add_variable(the_data, GDPpC ~ GDP/Population) 
    result 
    country year variable  value 
1  CHN 2000 GDPpC 0.04885649 
2  CHN 2010 GDPpC 2.62313658 
3  CHN 2020 GDPpC 0.31685382 
4  DEU 2000 GDPpC 0.80180998 
5  DEU 2010 GDPpC 0.62642877 
6  DEU 2020 GDPpC 0.97587188 
7  USA 2000 GDPpC 0.26383912 
8  USA 2010 GDPpC 1.01303516 
9  USA 2020 GDPpC 0.69851501 
Verwandte Themen