如何在R中的数据框中按列的每个因子级别查找行数?

时间:2019-06-03 17:54:17

标签: r for-loop group-by

我有几个具有不同数量的因子变量和输出变量的不同数据集。对于这些数据集中的每个数据集,我需要找到按行列的每个因子级别分组并进一步按所有变量(列)分组的观测行数。我以为for循环可能会解决问题,但是正在努力。有人可以帮忙吗?

数据集看起来像这样:

enter image description here

我希望输出成为 enter image description here

我尝试过

for (i in 1:length(df)){
df %>% group_by(df[[i]]) %>%  summarise(n = length(i))%>%print()

}

但这似乎不起作用

3 个答案:

答案 0 :(得分:2)

一种选择是将gather转换为'long'格式,然后执行count

library(tidyverse)
gather(df1, Variable,  Factor_Level, var1:var3) %>%
     count(Variable, Factor_Level)

答案 1 :(得分:1)

如果您可以使用列表格式,则可以在创建列表后停止。但是,这是akrun提出的{:a=>-100}方法的(有点复杂)替代方法:

gather

数据

# Getting a vector of factor variables in dataset
factor_vars <- names(factor_vars)[sapply(mtcars, is.factor)]

# Creating list of frequency tables
freq_tables <- lapply(factor_vars, function(x) group_by_(mtcars, .dots = x) %>% tally())

freq_tables <- lapply(freq_tables, function(x) cbind(colnames(x)[1], x))
do.call(rbind, lapply(freq_tables, setNames, c("Factor", "Level", "Count")))

   Factor Level Count
1      vs     0    18
2      vs     1    14
3      am     0    19
4      am     1    13
5    gear     3    15
6    gear     4    12
7    gear     5     5
8    carb     1     7
9    carb     2    10
10   carb     3     3
11   carb     4    10
12   carb     6     1
13   carb     8     1

答案 2 :(得分:0)

您应该能够执行

之类的操作
by(data$x, data$y, function)

其中data$x是您要排序的内容,data$y是您要排序的内容,function是您要对这些条目进行的操作(fx:均值,长度,shapiro.test等)。然后,您可以使用as.vector()将此输出强制为向量。

例如,如果我有一个带有df <- dataframe(ID <- c(1, 1, 1, 1, 2, 2, 3), value <- (10, 20, 30, 40, 50, 60, 70))的数据帧,那么运行as.vector(by(df$value, df$Id, lengh))将返回向量(4, 2, 1)