2016-12-25 6 views
-2

Ich verwende zwei verschiedene Möglichkeiten, cor.test zu verwenden, eine in meiner eigenen Funktion, die andere cor.test direkt verwendet. Wenn ich cor.test in meiner eigenen Funktion verwende, erschien ein Fehler, wie konnte es passieren? Diesecor.test, "nicht genug endliche Beobachtungen"

war OK

cor.test(x=cust_new$maintain_cust/cust_new$ttl_cust, 
     y=cust_new$ttl_cust,alternative="two.sided", 
     method="pearson",conf.level=0.95) 

Die folgende würde den Fehler geben:

"nicht genug endliche Beobachtungen"

cor_result<-function(x,y,data){ 
    a<-cor.test(x=as.numeric(data$x)/as.numeric(data$y), 
       y=as.numeric(data$y), 
       alternative="two.sided",method="spearman", 
       conf.level=0.95) 
    r<-a$estimate 
    p<-a$p.value 
    c<-data.frame(r=r,p=p) 
    return(c) 
} 

d<-cor_result(x=maintain_cust,y=ttl_cust,data=cust_new) 

Die folgende würde den Fehler geben :

'y' muss ein numerischer Vektor sein“

cor_result<-function(x,y,data){ 
    a<-cor.test(x=data$x/data$y,y=data$y, 
      alternative="two.sided",method="spearman",conf.level=0.95) 
    r<-a$estimate 
    p<-a$p.value 
    c<-data.frame(r=r,p=p) 
    return(c) 
} 

d<-cor_result(x=maintain_cust,y=ttl_cust,data=cust_new) 

dput (cust_new), ein paar Probe:

structure(list(data_month = structure(c(16953, 16983, 17014, 
17045, 17075, 17106, 16953, 16983, 17014, 17045), class = "Date"), 
    ttl_cust = c(383L, 580L, 735L, 850L, 952L, 1062L, 2418L, 
    2492L, 2515L, 2550L), maintain_cust = c(179L, 266L, 355L, 
    413L, 448L, 508L, 935L, 1026L, 1091L, 1143L)), row.names = c(NA, 
10L), class = "data.frame", .Names = c("data_month", "ttl_cust", 
"maintain_cust")) 
+2

Könnten Sie Bitte benutzen Sie 'dput (cust_new)' und fügen Sie die Ergebnisse in Ihre Frage ein, damit wir Ihre Ergebnisse reproduzieren können? – G5W

+1

Sie verwenden 'x' und' y' nicht innerhalb Ihrer 'cor_result' Funktion. –

+0

Ich benutze x und yx = as.numeric (Daten $ x)/as.numeric (Daten $ y), y = as.numeric (Daten $ y), – shan

Antwort

0

An der Wurzel Ich denke, dies ist eine Verwirrung über die Art, auf Spalten innerhalb eines Datensatzes zu verweisen. Insbesondere bei Verwendung von $ -Indexierung der Symbole nach der $ interpretiert wörtlich. Wenn Sie in Ihrer ersten Funktion auf data$x und data$y verweisen, sucht R nach Spalten mit den Namen "x" und "y" in Ihrem Objekt data. Diese existieren nicht in Datenrahmen, so NULL zurückgegeben (es wäre wohl besser, wenn R einen Fehler in diesem Fall wirft, aber na ja ...)

  • In Ihrer ersten Funktion, die Sie verwenden as.numeric(). as.numeric(NULL) gibt numeric(0) zurück (ein numerischer Nullvektor). Daher versucht cor.test, die Korrelation zwischen zwei Objekten der Länge Null zu berechnen und löst verständlicherweise den Fehler "nicht genügend endliche Beobachtungen" aus. (Versuchen Sie cor.test(numeric(0),numeric(0)) zu replizieren.)
  • In Ihrer zweiten Funktion übersetzen Sie nicht in numerisch, so dass Sie stattdessen cor.test(NULL,NULL) ausführen, was den Fehler "muss ein numerischer Vektor sein" gibt.

Was können Sie also tun?

  • @ Parfait Vorschlag # 1: x und y als Zeichenfolgen übergeben und [[ verwenden -indexing statt $ -indexing
  • @ Vorschlag des Parfait # 2: x und y als Objekte übergeben (dh, schauen Sie nicht für sie in data)

Wenn Sie wirklich wollen (1) verwenden, um ein data Argument und (2) die Werte als Symbole wird es tricker passieren, um die Dinge richtig zu tun.

  • Der einfachste Weg wäre deparse(substitute(x)) rufen Sie den Namen des Symbols als Zeichenfolge verwendet abzurufen, dann [[
  • -indexing verwenden Ansonsten können Sie eval verwenden, wenn Sie es sorgfältig verwenden. Zum Beispiel:
f <- function(a,b,data=dd) { 
    eval(substitute(a/b,list(a=quote(x),b=quote(y))),envir=dd) 
} 
dd <- data.frame(x=1,y=2) 
## set x and y to other values in the global env 
## so we can see that we got the right ones ... 
x <- 3 
y <- 4 
f(x,y) 
## 0.5 
1

Sie sind nicht richtig vorbei Vektor (das heißt, Datenrahmen Spalte) in Funktion. Betrachten Stringliterale Datenrahmenspalten vorbei mit doppelten Klammern referenziert werden (und as.numeric() möglicherweise nicht erforderlich, wenn Spalten numerische Typen sind):

cor_result<-function(x, y, data){ 
    a<-cor.test(x=as.numeric(data[[x]])/as.numeric(data[[y]]),y=as.numeric(data[[y]]), 
       alternative="two.sided", method="spearman", conf.level=0.95) 
    r<-a$estimate 
    p<-a$p.value 
    c<-data.frame(r=r,p=p) 
    return(c) 
} 

d<-cor_result(x="maintain_cust", y="ttl_cust", data=cust_new) 

Alternativ ohne Daten Argument:

cor_result<-function(x, y){ 
    a<-cor.test(x=(x/y),y=y, 
       alternative="two.sided", method="spearman", conf.level=0.95) 
    r<-a$estimate 
    p<-a$p.value 
    c<-data.frame(r=r,p=p) 
    return(c) 
} 

d<-cor_result(x=cust_new$maintain_cust, y=cust_new$ttl_cust) 
+0

Ihre Antwort perfekt gelöst mein Problem, danke ~~ – shan

+0

Groß! Froh, dass ich helfen konnte. Bitte bestätigen Sie die Antwort (Häkchen zur Seite), um die Auflösung zu bestätigen. – Parfait