sapply - 保留列名

时间:2018-05-22 15:48:32

标签: r sapply columnname

我试图总结我的数据集中的许多不同列(变量)的均值,sd等。我编写了自己的汇总函数来准确返回我需要的函数,并使用sapply将此函数同时应用于所有变量。它工作正常,但是返回的数据帧没有列名,我甚至无法使用列号引用重命名它们 - 也就是说它们似乎无法以任何方式使用。

我的代码如下 - 因为我只是在查找汇总统计信息,我想热衷于相同的列(变量)名称,包含4行(均值,sd,min,max)。有没有办法做到这一点(即使是我手动更改列名称的慢速方式)

 #GENERATING DESCRIPTIVE STATISTICS
sfsum= function(x){
  mean=mean(x)
  sd=sd(x)
  min=min(x)
  max=max(x)

  return(c(mean,sd,min,max))
}

#
c= list(sfbalanced$age_child, sfbalanced$earnings_child, 
sfbalanced$logchildinc ,sfbalanced$p_inc84, sfbalanced$login84, 
sfbalanced$p_inc85, sfbalanced$login85, sfbalanced$p_inc86, 
sfbalanced$login86, sfbalanced$p_inc87, sfbalanced$login87, 
sfbalanced$p_inc88, sfbalanced$login88)

summ=sapply(c,sfsum)

names(summ)
 NULL

2 个答案:

答案 0 :(得分:4)

如果在函数定义期间提供返回的名称,则可以将rownames作为函数名称,如果在定义对象时提供列表名称,则可以使用USE.NAMES中的sapply来获取自动命名。

关于mtcars数据的示例可以为您提供以下输出。

<强>代码

sfsum= function(x){
    mean=mean(x)
    sd=sd(x)
    min=min(x)
    max=max(x)

    return(c("mean"=mean,"sd"=sd,"min" = min,"max" =max)) #For rownames
}

#
x= list("mpg" = mtcars$mpg, "disp" = mtcars$disp, "drat" = mtcars$drat)
#For column names

summ=sapply(x,sfsum, USE.NAMES = TRUE) #USE.NAMES = TRUE to get names on top

<强>输出

> summ
           mpg     disp      drat
mean 20.090625 230.7219 3.5965625
sd    6.026948 123.9387 0.5346787
min  10.400000  71.1000 2.7600000
max  33.900000 472.0000 4.9300000

答案 1 :(得分:2)

如果我们还需要列名称,只需遍历数据集(假设我们在所有列上应用该函数)

out <- sapply(df2, sfsum)
row.names(out) <- c('mean', 'sd', 'min', 'max')

数据

set.seed(24)
df2 <- as.data.frame(matrix(rnorm(4*4), 4, 4))