2016-12-25 875 views
-2

我使用兩種不同的方式來使用cor.test,一種在我自己的功能中,另一種則直接使用cor.test。當我在自己的功能中使用cor.test時,它出現了一個錯誤,它怎麼會發生?cor.test,「沒有足夠的有限觀測值」

這是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) 

下面將給出錯誤:

「沒有足夠的有限的意見」

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) 

下面會給錯誤:

'Y' 必須是數字載體」

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),幾個樣品

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

你能請使用'dput(cust_new)'並將結果粘貼到您的問題中,以便我們可以重現您的結果? – G5W

+1

你的'cor_result'函數中根本不使用'x'和'y'。 –

+0

我使用x和yx = as.numeric(數據$ x)/as.numeric(數據$ y), y = as.numeric(數據$ y), – shan

回答

0

在根我認爲這是一個關於混亂參考數據集中的列的方式。特別是在使用$時,暗示$後面的符號的字面意思是。當您在第一個函數中引用data$xdata$y時,R將在您的data對象中查找名爲「x」和「y」的列。這些並不在數據幀存在,所以返回NULL(這將無疑會更好,如果R的情況下,拋出一個錯誤,但哦...)

  • 在你的第一個功能,您使用as.numeric()as.numeric(NULL)返回numeric(0)(零長度數字向量)。因此,cor.test試圖計算兩個零長度對象之間的相關性,並且可以理解地提出「不夠有限的觀察值」錯誤。 (嘗試使用cor.test(numeric(0),numeric(0))進行復制。)
  • 在第二個函數中,您不會將其轉換爲數字,而是執行cor.test(NULL,NULL),它會給出「必須是數字向量」錯誤。

那麼你能做什麼?

  • @芭菲的建議1:通過xy字符串和使用[[ -indexing而不是$ -indexing
  • @芭菲的建議#2:通過xy爲對象(即不看他們在data

如果你真的想(1)使用data參數和(2)通過爲符號它得到技巧就做的事情正確的價值觀。

  • 最簡單的方法是調用deparse(substitute(x))檢索名稱作爲字符串的象徵,然後用[[ -indexing
  • 否則,你可以使用eval,如果您小心使用。例如:
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

您還沒有正確地傳遞載體(即,數據幀列)成函數。考慮通過數據幀列的字符串常量與雙括號引用(如果列是數字類型as.numeric()可能不是必要的):

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) 

或者不數據說法:

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

您的回答完全解決了我的問題,謝謝~~ – shan

+0

大!很高興我能幫上忙。請接受答案(勾選標記到旁邊)以確認解決方案。 – Parfait

相關問題