我有一个功能,我用它来快速查看data.frame ...我处理了大量的调查数据,这可以作为一个快速的工具,看看是什么。
f.table <- function(x) {
if (is.factor(x[[1]])) {
frequency <- function(x) {
x <- round(length(x)/n, digits=2)
}
x <- na.omit(melt(x,c()))
x <- cast(x, variable ~ value, frequency)
x <- cbind(x,top2=x[,ncol(x)]+x[,ncol(x)-1], bottom=x[,2])
}
if (is.numeric(x[[1]])) {
frequency <- function(x) {
x[x > 1] <- 1
x[is.na(x)] <- 0
x <- round(sum(x)/n, digits=2)
}
x <- na.omit(melt(x))
x <- cast(x, variable ~ ., c(frequency, mean, sd, min, max))
x <- transform(x, variable=reorder(variable, frequency))
}
return(x)
}
我发现如果我没有在函数之外定义“频率”,它会返回具有连续变量的数据帧的不稳定结果。只要我这样做,在函数之外使用哪个定义似乎并不重要。
尝试:
n <- 100
x <- data.frame(a=c(1:25),b=rnorm(100),c=rnorm(100))
x[x > 20] <- NA
现在,选择其中一个频率功能并将其粘贴并再次尝试:
frequency <- function(x) {
x <- round(length(x)/n, digits=2)
}
f.table(x)
为什么?
答案 0 :(得分:1)
至关重要的是,我认为这就是你的问题所在。 cast()
正在评估这些函数,而不参考它所调用的函数。在cast()
内,它会通过fun.aggregate
对funstofun
进行评估,虽然我并不真正关注它正在做的事情,但却得到的是stats:::frequency
,而不是您当地的。{/ p>
因此我对你的问题发表评论。你有什么功能要做?目前,似乎有必要在全球环境中定义“频率”功能,以便cast()
或funstofun()
找到它。给它一个唯一的名称,这样它就不可能与任何东西发生冲突,所以它应该是唯一找到的东西,比如.Frequency()
。不知道你想对函数做什么(而不是你认为函数[f.table]应该做什么),提供进一步的指导有点困难,但为什么没有.FrequencyNum()
和{{1}在全局工作空间中定义并重写您的.FrequencyFac()
包装器调用以使用相关的调用?
f.table()
我认为哪个会起作用,但它找不到N,它应该是。所以也许我在这里错过了什么?
顺便说一句,依靠从函数外部找到.FrequencyFac <- function(X, N) {
round(length(X)/N, digits=2)
}
.FrequencyNum <- function(X, N) {
X[X > 1] <- 1
X[is.na(X)] <- 0
round(sum(X)/N, digits=2)
}
f.table <- function(x, N) {
if (is.factor(x[[1]])) {
x <- na.omit(melt(x, c()))
x <- dcast(x, variable ~ value, .FrequencyFac, N = N)
x <- cbind(x,top2=x[,ncol(x)]+x[,ncol(x)-1], bottom=x[,2])
}
if (is.numeric(x[[1]])) {
x <- na.omit(melt(x))
x <- cast(x, variable ~ ., c(.FrequencyNum, mean, sd, min, max), N = N)
##x <- transform(x, variable=reorder(variable, frequency))
## left this out as I wanted to see what cast returned
}
return(x)
}
(在您的版本中)的函数可能不是一个好主意。始终传递您需要的变量作为参数。
答案 1 :(得分:0)
我没有包含melt
的软件包,但我可以看到一些潜在的问题:
frequency
函数没有return
任何内容。x
是输入和输出。)frequency
包中已存在通用stats
函数,这可能会导致方法调度问题(我不确定)。