R中ifelse语句的汇总统计
Summary statistic with ifelse statement in R
我想设置我的自定义汇总统计功能,如果该列是一个因素,我希望看到 prop.table
而不是汇总统计。
set.seed(123)
df <- data.frame(replicate(6, sample(c(1:10, -99),6, rep = T)))
df$X7 <- factor(df$X6, levels = c(7,9,10)); str(df)
summary <- function(x){
if (is.numeric(x)){
funs <- c(mean, median, sd, mad, IQR)
lapply(funs, function(f) f(x, na.rm = T))
}
else
df[] <- {lapply(df, prop.table)} #not sure how to save the outcome
}
summary(df)
预期答案
mean median sd mad IQR
X1 mean(X1)
X2 mean(X2)
X3
X4
X5
X6
X7.Factor7 prop.table(X7.Factor7)
X7.Factor9 prop.table(X7.Factor9)
X7.Factor10 prop.table(X7.Factor10)
您需要重新考虑您希望输出的显示方式。描述性统计数据和 table 将不容易结合起来,因为它们可以以任何顺序出现。这是开始考虑它的一种方法。
stats <- function(x) {
if (is.numeric(x)) {
c(mean=mean(x), median=median(x), sd=sd(x), mad=mad(x), IQR=IQR(x))
} else {
prop.table(table(x))
}
}
result <- sapply(df, stats)
result
# $X1
# mean median sd mad IQR
# -12.50000 3.00000 42.47705 2.96520 3.00000
#
# $X2
# mean median sd mad IQR
# -10.83333 5.50000 43.25467 3.70650 4.00000
#
# $X3
# mean median sd mad IQR
# -10.66667 7.00000 43.34820 2.96520 5.50000
#
# $X4
# mean median sd mad IQR
# 7.833333 8.500000 2.639444 2.223900 2.500000
#
# $X5
# mean median sd mad IQR
# -13.16667 3.50000 42.09711 2.96520 3.25000
#
# $X6
# mean median sd mad IQR
# 8.666667 9.000000 1.366260 1.482600 2.250000
#
# $X7
# x
# 7 9 10
# 0.3333333 0.3333333 0.3333333
您可以将数值向量与
num <- sapply(df, is.numeric)
do.call(rbind, result[num])
但是您仍然需要单独处理table/tables。
我想设置我的自定义汇总统计功能,如果该列是一个因素,我希望看到 prop.table
而不是汇总统计。
set.seed(123)
df <- data.frame(replicate(6, sample(c(1:10, -99),6, rep = T)))
df$X7 <- factor(df$X6, levels = c(7,9,10)); str(df)
summary <- function(x){
if (is.numeric(x)){
funs <- c(mean, median, sd, mad, IQR)
lapply(funs, function(f) f(x, na.rm = T))
}
else
df[] <- {lapply(df, prop.table)} #not sure how to save the outcome
}
summary(df)
预期答案
mean median sd mad IQR
X1 mean(X1)
X2 mean(X2)
X3
X4
X5
X6
X7.Factor7 prop.table(X7.Factor7)
X7.Factor9 prop.table(X7.Factor9)
X7.Factor10 prop.table(X7.Factor10)
您需要重新考虑您希望输出的显示方式。描述性统计数据和 table 将不容易结合起来,因为它们可以以任何顺序出现。这是开始考虑它的一种方法。
stats <- function(x) {
if (is.numeric(x)) {
c(mean=mean(x), median=median(x), sd=sd(x), mad=mad(x), IQR=IQR(x))
} else {
prop.table(table(x))
}
}
result <- sapply(df, stats)
result
# $X1
# mean median sd mad IQR
# -12.50000 3.00000 42.47705 2.96520 3.00000
#
# $X2
# mean median sd mad IQR
# -10.83333 5.50000 43.25467 3.70650 4.00000
#
# $X3
# mean median sd mad IQR
# -10.66667 7.00000 43.34820 2.96520 5.50000
#
# $X4
# mean median sd mad IQR
# 7.833333 8.500000 2.639444 2.223900 2.500000
#
# $X5
# mean median sd mad IQR
# -13.16667 3.50000 42.09711 2.96520 3.25000
#
# $X6
# mean median sd mad IQR
# 8.666667 9.000000 1.366260 1.482600 2.250000
#
# $X7
# x
# 7 9 10
# 0.3333333 0.3333333 0.3333333
您可以将数值向量与
num <- sapply(df, is.numeric)
do.call(rbind, result[num])
但是您仍然需要单独处理table/tables。