我使用两种不同的方式来使用cor.test
,一种在我自己的函数中,另一种直接使用cor.test
。当我在自己的函数中使用cor.test
时,它出现了错误,它怎么可能发生?
这是确定
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"))
答案 0 :(得分: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)
或者没有 data 参数:
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)
答案 1 :(得分:0)
从根本上来说,我认为这是对引用数据集中列的方式的混淆。特别是,当使用$
- 在$
解释字面之后对符号编制索引。当您在第一个函数中引用data$x
和data$y
时,R正在查找名为&#34; x&#34;的列。和&#34; y&#34;在您的data
对象中。这些不存在于您的数据框中,因此返回NULL
(如果R在这种情况下引发错误,可能会更好,但是哦......)
as.numeric()
。 as.numeric(NULL)
返回numeric(0)
(零长度数字向量)。因此,cor.test
试图计算两个零长度对象之间的相关性,并且可以理解地抛出了不够的有限观察值。错误。 (尝试cor.test(numeric(0),numeric(0))
复制。)cor.test(NULL,NULL)
,这使得&#34;必须是一个数字向量&#34;错误。那你能做什么?
x
和y
作为字符串传递并使用[[
- 索引而不是$
- 索引x
和y
作为对象传递(即,不要在data
中查找)如果你真的想(1)使用data
参数并且(2)将值作为符号传递,那么它就会变得棘手来正确地做事。
deparse(substitute(x))
来检索用作字符串的符号的名称,然后使用[[
- 索引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