2016-06-23 9 views
0

Ich habe einen Vektor wie folgt aus:Wie erstellen Sie einen leeren Datenrahmen mit einer Funktion in R?

dput(xv) 
c("Users", "Transactions", "Workload") 

Ich brauche einen leeren Datenrahmen auf Einträge in Vektor xv Basis zu schaffen, um der Lage sein, eine Funktion.

Zum Beispiel sollte es so sein:

new_df <- data.frame(
    Users = character(), 
    Transactions = character(), 
    Workload = character() 
) 

da die Werte in xv ändern könnte und die Anzahl der Einträge in xv könnte auch ändern, müssen ich in der Lage sein, dies unter Verwendung einer Funktion zu tun?

Irgendwelche Ideen, wie ich das tun könnte?

+1

Wenn die Spaltentypen variieren und die Anzahl der Spalten variieren, warum benötigen Sie eine Funktion. Sie können 'setNames (data.frame (....), xv)' – akrun

Antwort

4

Ich denke, das tut, was Sie wollen:

do.call(data.frame,setNames(lapply(xv,function(e) vector(typeof(e))),xv)); 
## [1] Users  Transactions Workload 
## <0 rows> (or 0-length row.names) 

Edit: Dank dafür, dass ich ein wenig mehr über meine Lösung denken @Zheyuan. Da die Eingabe (wie vom OP angegeben) ein atomarer Vektor ist, kann sie keine heterogenen Datentypen enthalten, so dass mein Aufruf lapply(), der je nach Typ des Eingabeelements einen separaten Nullvektor erzeugt, keinen Vorteil bietet. Es würde einen Vorteil bieten, wenn xv eine Liste war, die heterogene Datentypen enthalten kann, aber da xv auch verwendet wird, um die Namen des resultierenden data.frame festzulegen, wäre es sehr fraglich, wenn es Nicht-Zeichenelemente enthielt . Meine Lösung ist also nicht so vernünftig, wie ich gedacht habe.

Hier ist eine vernünftigere Lösung die do.call(data.frame,...) Muster verwenden, die den lapply() Anruf mit rep() ersetzt:

do.call(data.frame,setNames(rep(list(character()),length(xv)),xv)); 
## [1] Users  Transactions Workload 
## <0 rows> (or 0-length row.names) 
+0

danke, es funktionierte wie ein Charme – user1471980

3

Da die OP eine Funktion wollte und weil ich bemerkte setNames erste

f1 <- function(nm1){ 
     len <- length(nm1) 
     setNames(as.data.frame(matrix(typeof(nm1), 0, len), 
         stringsAsFactors=FALSE), nm1) 
    } 

f1(xv) 
#[1] Users  Transactions Workload  
#<0 rows> (or 0-length row.names) 

str(f1(xv)) 
#'data.frame': 0 obs. of 3 variables: 
#$ Users  : chr 
#$ Transactions: chr 
#$ Workload : chr 

Die matrix(.. Teil wird aus @ ZheyuanLis Kommentar gestohlen.

+0

@ZheyuanLi Er machte es ein bisschen perfekter mit den Spalten Klassen. – akrun

2

Ich würde so etwas tun:

MakeDF.R <- function(CustomVector){ 
    NewDF <- data.frame(matrix(nrow=0,ncol=length(CustomVector))) 
    #Matrixes can be easier to make, and wrapping in data.frame() quickly converts them 
    colnames(NewDF) <- CustomVector 
    #give the New dataframe columns names based on the vector you fed in 
    return(NewDF) 
} 

So die Funktion wie unter

CusVec<-c('a','b','c') 
CustomDF <- MakeDF.R(CusVec) 

Returns

> CustomDF 
[1] a b c 
<0 rows> (or 0-length row.names) 

Aufruf oder einen Datenrahmen mit einer festgelegten Anzahl erhalten von Zeilen (effizienter zum Einbetten von Daten, als jedes Mal eine neue Zeile zu erstellen, wenn Sie wissen, wie viele Zeilen Sie möchten, bevor ha nd)

CusVec<-c('a','b','c') 

MakeDF.R <- function(CustomVector,n){ 
    NewDF <- data.frame(matrix(nrow=n,ncol=length(CusVec))) 
    colnames(NewDF) <- CustomVector 
    return(NewDF) 
} 

CustomDF <- MakeDF.R(CusVec,3) 
Verwandte Themen