灵活的功能R.

时间:2013-08-06 20:58:57

标签: r statistics user-defined-functions

我已经编写了一些代码来创建我自己的描述性统计表,因为默认的summary没有达到我想要的效果。

现在我想要的是创建一个灵活/动态的函数,用不同数量的变量来完成这个。

我的代码如下所示:

N <- c( length(data1), length(data2), length(data3) ) 
mean<- c( mean(data1), mean(data2), mean(data3) )
sd <- c( sd(data1), sd(data2), sd(data3) )
min <- c( min(data1), min(data2), min(data3) )
max <- c( max(data1), max(data2), max(data3) )
print(q) <- data.frame(N, mean, sd, min, max)

因此,如果我想要描述除3个变量以外的其他内容,而不是编辑这个,我想要一个像这样做的函数;

descriptive <- function(data1, ...) {
  N <- c( length(data1), length(...) ) 
  mean<- c( mean(data1), mean(...) )
  sd <- c( sd(data1), sd(...) )
  min <- c( min(data1), min(...) )
  max <- c( max(data1), max(...) )
  q <- data.frame(N, mean, sd, min, max)
  print(q)
}

我尝试了上述内容并希望它可以工作,但它只适用于两个变量。正如你可能看到的,我是R的新手。我试图寻找解决方案,但我找不到。但如果R和“他们”说的一样好,我认为这样的事情应该是可能的。

可能已经有了这个功能,但我希望自己可以做到这一点。 (:希望有人可以帮助我!

EDIT !!

谢谢大家的回答,他们似乎都有效。这表明在R中对同一个问题有多个答案。我不知道你是否得到了接受答案的分数,如果这很重要,但我选择了Arun的答案,因为它关闭了我的目标,即创建一个描述性表格,是“好看”和灵活。

如果将来有兴趣的话我会将此添加到Arun的答案中,使其符合我的目的;

data <- list(var1, var2 ...)
names <- c"name1", "name2", "...")
descriptive(data)

此解决方案似乎也具有不同长度的变量与数据帧的优势。

3 个答案:

答案 0 :(得分:4)

这是学习apply系列函数的好机会,这样您就可以将预期输出指定为函数,然后apply指定数据框。

mydf <- data.frame(x=rnorm(100), y=rnorm(100)) # example data

descriptive <- function(x)
   c(length=length(x), mean=mean(x), sd=sd(x), min=min(x), max=max(x))

sapply(mydf, descriptive) # apply `descriptive` to the df

输出:

                   x             y             z
length  1.000000e+03 1000.00000000 1000.00000000
mean    3.846765e-03   -0.02009427    0.02001385
sd      9.818488e-01    0.97662850    1.01543571
min    -2.905149e+00   -3.25904432   -3.33017918
max     3.235993e+00    2.86892044    3.13183601

对此的一个警告是,除非您开发更复杂的descriptive函数,否则它将无法处理数据中的NA值,并且会导致您在不同类中的变量出现问题数据帧(例如,字符向量的平均值为NA)。

这比构建一个内部应用于向量列表的函数(如Arun建议)和 plyr (来自Baptiste:ldply(mydf, each(length, mean, sd, min, max)))更有效:

mydf <- data.frame(x=rnorm(1e5),y=rnorm(1e5),z=rnorm(1e5))
microbenchmark(sapply(mydf,thomas), arun(mydf), baptiste(mydf))

Unit: milliseconds
                 expr       min        lq    median        uq      max neval
 sapply(mydf, thomas)  5.693252  6.039458  7.139658  7.953309 43.32675   100
           arun(mydf) 15.805778 18.522889 19.417559 22.016125 57.93630   100
       baptiste(mydf) 10.995073 11.597998 12.666252 13.861521 47.85533   100

答案 1 :(得分:3)

如果您真的希望能够使用...

test <- list( seq(10), seq(5) )

descriptiveRow <- function(x) {
  res <- c(length(x), mean(x), sd(x), min(x), max(x))
  names(res) <- c("N","Mean","SD","Min","Max")
  res
}

descriptive <- function( ... ) {
  l <- list(...)
  res <- as.data.frame( lapply( l, descriptiveRow ) )
  colnames(res) <- seq(ncol(res))
  res
}

descriptive(test[[1]], test[[2]])

> descriptive(test[[1]], test[[2]])
            1        2
N    10.00000 5.000000
Mean  5.50000 3.000000
SD    3.02765 1.581139
Min   1.00000 1.000000
Max  10.00000 5.000000

答案 2 :(得分:2)

您可以为函数参数提供list作为输入,然后在每个参数上使用sapply来获取每个数据的统计信息。

descriptive <- function(ll) {
    N <- sapply(ll, length)
    mean <- sapply(ll, mean)
    sd <- sapply(ll, sd)
    min <- sapply(ll, min)
    max <- sapply(ll, max)
    print(out <- data.frame(N, mean, sd, min, max))
}

descriptive(list(1:5, 6:10))

  N mean       sd min max
1 5    3 1.581139   1   5
2 5    8 1.581139   6  10

注意:即使您的输入是data.frame,这也会有效,并且您需要统计data.frame的所有列(因为它在内部是一个列表)。

descriptive(data.frame(1:5, 6:10))
      N mean       sd min max
X1.5  5    3 1.581139   1   5
X6.10 5    8 1.581139   6  10