2016-09-22 7 views
0

ich folgenden Code haben:R: Anwenden Funktion Dataframe

library(Ecdat) 
data(Fair) 
Fair[1:5,] 

x1 = function(x){ 
    mu = mean(x) 
    l1 = list(s1=table(x),std=sd(x)) 
    return(list(l1,mu)) 
} 

mylist <- as.list(Fair$occupation, 
       Fair$education) 

x1(mylist) 

Was wollte ich, dass x1 das Ergebnis für die Elemente in mylist ausgewählt ausgibt. Ich bekomme jedoch In mean.default(x) : argument is not numeric or logical: returning NA.

+2

Bitte überprüfen Sie die 'str' von' Mylist'. Wenn es eine "Liste" ist, durchlaufen Sie die Listenelemente und wenden Sie die Funktion an, dh. 'lapply (mylist, x1)' Außerdem denke ich, dass 'as.list' nicht das tut, was Sie beabsichtigt haben, da es sich in eine' liste' der Länge 601 mit je 1 Element aufteilt. Vielleicht brauchen Sie nur 'lapply (Fair [c (" Beruf "," Bildung "), x1)' – akrun

Antwort

0

Sie müssen lapply verwenden, wenn Sie eine Liste an eine Funktion

output<-lapply(mylist,FUN=x1) 

Diese Ihre Funktion x1 für jedes Element in mylist verarbeitet und eine Liste der Ergebnisse zur Ausgabe zurück.

0

Hier die mylist ist nicht in der richtigen Art und Weise erstellt und ein list ist auch nicht erforderlich, da data.frame ein list mit Spalten gleich lang ist. Also, Teilmenge nur die Spalten von Interesse und anwenden, um die Funktion

lapply(Fair[c("occupation", "education")], x1) 

In dem Code des OP erstellt as.list einfach ein list von length 601 mit nur einem einzigen Elemente in jedem.

str(mylist) 
#List of 601 
#$ : int 7 
#$ : int 6 
#$ : int 1 
#... 
#... 

Ein weiteres Problem im Code ist, dass es nicht einmal das zweite Argument berücksichtigt. Mit einem einfachen Beispiel

as.list(1:3, 1:2) 
#[[1]] 
#[1] 1 

#[[2]] 
#[1] 2 

#[[3]] 
#[1] 3 

Das zweite Argument wird überhaupt nicht berücksichtigt. Es hätte

gewesen
list(1:3, 1:2) 
#[[1]] 
#[1] 1 2 3 

#[[2]] 
#[1] 1 2 

Aber für data.frame Spalten, wir brauchen nicht explizit die list nennen, da es ein list von vectors ist, die gleiche Länge haben.

In Bezug auf den Fehler in der OP Post, funktioniert mean auf vector s und nicht auf list oder data.frame.

Verwandte Themen