3

我已经编写了一些代码来创建我自己的描述性统计表,因为默认值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​​ 和“他们”说的一样好,我认为这样的事情应该是可能的。

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

编辑!!

谢谢大家的回答,它们似乎都有效。这表明 R 中同一个问题有多个答案。我不知道您是否会为接受的答案获得分数以及这是否重要,但我选择 Arun 答案,因为它接近我创建描述性表格的目标是“好看”和灵活的。

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

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

该解决方案似乎还具有不同长度的变量与数据帧的好处。

4

3 回答 3

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
于 2013-08-06T21:03:50.637 回答
3

您可以提供 alist作为函数参数的输入,然后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

注意:即使您的输入是 adata.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
于 2013-08-06T21:08:01.800 回答
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
于 2013-08-06T21:03:52.753 回答