R 灵活功能

R 灵活功能,r,statistics,user-defined-functions,R,Statistics,User Defined Functions,我已经编写了一些代码来创建自己的描述性统计表,因为默认的摘要不符合我的要求 现在我想创建一个灵活的/动态的函数,用不同数量的变量来实现这一点 我的代码如下所示: 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(

我已经编写了一些代码来创建自己的描述性统计表,因为默认的
摘要
不符合我的要求

现在我想创建一个灵活的/动态的函数,用不同数量的变量来实现这一点

我的代码如下所示:

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)

N这将是学习
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
需要注意的一点是,除非您开发更复杂的
描述性
函数,否则它将无法处理数据中的
NA
值,并将导致数据帧中不同类别的变量出现问题(例如,字符向量的平均值为
NA

这也比构建一个内部应用于向量列表(如Arun所建议)和plyr(来自Baptiste:
ldply(mydf,每个(长度、平均值、标准差、最小值、最大值))的函数更有效。
):


mydf如果您确实希望能够使用

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

test您可以提供一个
列表
作为函数参数的输入,然后对每个参数使用
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

apply
和数据帧不能很好地结合在一起,因为它将其参数转换为矩阵。使用
lappy
代替。对于plyr,
ldply(mydf,每个(长度、平均值、标准差、最小值、最大值))
@baptiste我喜欢这种语法,它非常简洁。或者使用
函数(…)ll
                   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
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
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
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
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