我有一个具有不同字段的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)
我有几个像这样的数据集,因此我想创建一个返回摘要的函数。此摘要将由字段的平均值组成,仅当字段为数字时,如果字段为因子,则为级别数。
答案 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))