函数返回数字类型的均值

时间:2017-10-18 03:33:05

标签: r function types numeric

我有一个具有不同字段的df,每个字段都有不同的数据类型:日期,数字,因子等。例如:

ID<- c(1,2,3)
AGE <- c(25,32,28)
SEX <- c(1,0,0)
HEIGHT <- c(152,172, 163)
WEIGHT <-c(65,53,70)
DF<-data.frame(ID, AGE, SEX, HEIGHT, WEIGHT)

我有几个像这样的数据集,因此我想创建一个返回摘要的函数。此摘要将由字段的平均值组成,仅当字段为数字时,如果字段为因子,则为级别数。

2 个答案:

答案 0 :(得分:0)

如果字段是一个因素,那么&#34;级别数量的约束&#34;有点简化。如果字段是character怎么办? logical

第一个例子。我将添加factor

的向量
FAC <- c('abc','abc','def')
DF <- data.frame(ID, AGE, SEX, HEIGHT, WEIGHT, FAC)
lapply(DF, function(x) if (is.numeric(x)) mean(x) else length(levels(x)))
# $ID
# [1] 2
# $AGE
# [1] 28.33333
# $SEX
# [1] 0.3333333
# $HEIGHT
# [1] 162.3333
# $WEIGHT
# [1] 62.66667
# $FAC
# [1] 2

如果你需要更多控制,也许你可以用以下方式扩展它:

lapply(DF, function(x) {
  if (is.logical(x)) x <- 1*x                    # turns into numeric, will show percentage of TRUE
  if (is.numeric(x)) return(mean(x))             # mean
  if (is.factor(x)) return(length(levels(x)))    # number of levels
  if (is.character(x)) return(length(unique(x))) # number of distinct strings, similar to levels
  if (inherits(x, "POSIXct")) return(min(x))     # min date/time
  return("oops")
})

你当然可以合并一些,例如is.numeric(x) || is.logical(x)甚至is.numeric(x) || inherits(x, "POSIXct)

答案 1 :(得分:0)

ID<- factor(c(1,2,3))

AGE <- c(25,32,28)
SEX <- factor(c('Male','Female','Male'))
HEIGHT <- c(152,172, 163)
WEIGHT <-c(65,53,70)

DF<-data.frame(ID, AGE, SEX, HEIGHT, WEIGHT)

# df_summary <- function(df) {
#   col_types <- sapply(df,class)
#   return(col_types)
# }

df_summary <- function(df) {
  numeric_cols <- df[,which(sapply(df, class) == "numeric")]
  numeric_means_df <- data.frame('Mean' = sapply(numeric_cols,mean))
  factor_cols <- df[,which(sapply(df,class) == 'factor')]
  factor_cols_summary <- summary(factor_cols)
  return(list('Numeric' = numeric_means_df,'Factors' = factor_cols_summary))

}

print(df_summary(DF))

enter image description here