在 R 中一次生成多个频率表
Producing multiple frequency tables at once in R
我在列上有一个包含不同类型变量(数字、字符、因子)的数据框,我想立即对其进行总结。我有一个 ID 列要根据其他列的级别进行计数。
如果每列是字符或因子,它们都有不同的级别,我想知道每个级别的 ID 频率。此外,如果该列是数字,我希望返回摘要统计信息,例如均值、标准差和分位数。
理想情况下,我会使用 dplyr
和 group_by()
和 summarise()
函数来执行此操作,但它需要我一次对每一列进行分组,然后指定是否要用 n()
或者我是否因为是数字而想要汇总统计信息。
在 SAS
中有一个名为 PROC FREQ
的命令,我正在尝试复制它。
df<-
data.frame(
ID = c(1,2,3,4,5,6),
Age = c(20, 30, 45, 60, 70, 18),
Car = c("Zum", "Yat", "Zum", "Zum", "Yat", "Rel"),
Side = c("Left", "Right", "Left", "Left", "Right", "Right")
)
结果:
df %>% group_by(Car) %>% summarise(n = n())
df %>% group_by(Side) %>% summarise(n = n())
df %>% summarise(mean = mean(Age))
我想在单个输出和多个变量中获得此结果。我真正的 df 包含数十列,这些列应该是分组变量或不是取决于它们的性质。此外,ID
甚至可以重复使用相同的值来汇总观察结果。
您可以编写一个函数来根据它的 class 采取行动。在这里,如果列的 class 是数字,我们计算平均值,否则计算列中唯一值的 count
。
library(dplyr)
purrr::map(names(df)[-1], function(x) {
if(is.numeric(df[[x]])) df %>% summarise(mean = mean(.data[[x]]))
else df %>% count(.data[[x]])
})
#[[1]]
# mean
#1 40.5
#[[2]]
# Car n
#1 Rel 1
#2 Yat 2
#3 Zum 3
#[[3]]
# Side n
#1 Left 3
#2 Right 3
我在列上有一个包含不同类型变量(数字、字符、因子)的数据框,我想立即对其进行总结。我有一个 ID 列要根据其他列的级别进行计数。
如果每列是字符或因子,它们都有不同的级别,我想知道每个级别的 ID 频率。此外,如果该列是数字,我希望返回摘要统计信息,例如均值、标准差和分位数。
理想情况下,我会使用 dplyr
和 group_by()
和 summarise()
函数来执行此操作,但它需要我一次对每一列进行分组,然后指定是否要用 n()
或者我是否因为是数字而想要汇总统计信息。
在 SAS
中有一个名为 PROC FREQ
的命令,我正在尝试复制它。
df<-
data.frame(
ID = c(1,2,3,4,5,6),
Age = c(20, 30, 45, 60, 70, 18),
Car = c("Zum", "Yat", "Zum", "Zum", "Yat", "Rel"),
Side = c("Left", "Right", "Left", "Left", "Right", "Right")
)
结果:
df %>% group_by(Car) %>% summarise(n = n())
df %>% group_by(Side) %>% summarise(n = n())
df %>% summarise(mean = mean(Age))
我想在单个输出和多个变量中获得此结果。我真正的 df 包含数十列,这些列应该是分组变量或不是取决于它们的性质。此外,ID
甚至可以重复使用相同的值来汇总观察结果。
您可以编写一个函数来根据它的 class 采取行动。在这里,如果列的 class 是数字,我们计算平均值,否则计算列中唯一值的 count
。
library(dplyr)
purrr::map(names(df)[-1], function(x) {
if(is.numeric(df[[x]])) df %>% summarise(mean = mean(.data[[x]]))
else df %>% count(.data[[x]])
})
#[[1]]
# mean
#1 40.5
#[[2]]
# Car n
#1 Rel 1
#2 Yat 2
#3 Zum 3
#[[3]]
# Side n
#1 Left 3
#2 Right 3