Как я могу найти количество строк по каждому уровню фактора каждого столбца в кадре данных в R? - PullRequest
0 голосов
/ 03 июня 2019

У меня есть несколько разных наборов данных с различным количеством факторных переменных и выходной переменной.Для каждого из этих наборов данных мне нужно найти количество строк наблюдений, сгруппированных по каждому факторному уровню переменных и далее сгруппированных по всем переменным (столбцам).Я думал, что цикл for мог бы добиться цели, но я борюсь с этим.Может ли кто-нибудь помочь с этим?

набор данных выглядит примерно так:

введите описание изображения здесь

, и я хочу, чтобы результат был введите описание изображения здесь

Я пробовал

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

}

, но это не похоже на работу

Ответы [ 3 ]

2 голосов
/ 03 июня 2019

Можно указать gather в формате 'long', а затем выполнить count

library(tidyverse)
gather(df1, Variable,  Factor_Level, var1:var3) %>%
     count(Variable, Factor_Level)
1 голос
/ 03 июня 2019

Если вы согласны с форматом списка, вы можете остановиться после создания списка.Однако это (несколько сложная) альтернатива методу gather, предложенному akrun:

# 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

Данные :

mtcars[8:11] <- lapply(mtcars[8:11], factor)
0 голосов
/ 03 июня 2019

Вы должны быть в состоянии сделать что-то вроде

by(data$x, data$y, function)

где data$x - это то, что вы хотите отсортировать, data$y - это то, для чего вы сортируете, а function - это то, что вы хотите сделать с этими записями (fx: mean, length, 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)

...