Составление таблицы частот по группам с вычислением количества значений в R

Предположим, это мой набор данных

(dput)
dataset<-structure(list(group1 = structure(c(2L, 2L, 2L, 2L, 2L, 1L, 1L, 
1L, 1L), .Label = c("b", "x"), class = "factor"), group2 = structure(c(2L, 
2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L), .Label = c("g", "y"), class = "factor"), 
    var1 = c(2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L)), .Names = c("group1", 
"group2", "var1"), class = "data.frame", row.names = c(NA, -9L
))

Мне нужно рассчитать частоту для двух групп

x+y
b+g

а для переменной var1 вычислить количество 1 значения и 2 значений. Для каждой группы. Итак, желаемый результат

        total_count_of_group    var1-1  var1-2
x   y          5                   
                              3         2
b   g          4              2         2

Этот вывод означает, что total_count_of_group x + y = 5 набл. этой группой. где 1 значение встречается 3 раза, а 2 - два раза.

подобный total_count_of_group b + g = 4 набл. этой группой. где 1 значение встречается 2 раза и 2 значения два раза.

Как получить такую ​​таблицу?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
2 088
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы можете создать три таблицы, выбрать соответствующие значения и затем объединить их во фрейм данных.

a <- table(dataset$group1, dataset$group2)
b <- table(dataset$var1[dataset$group1=='x'])
d <- table(dataset$var1[dataset$group1=='b'])

data.frame(total_count_of_group = c(a[2,2], a[1,1]), 
           var1_1 = c(b[1], b[2]),
           var1_2 = c(d[1], d[2]))

  total_count_of_group var1_1 var1_2
1                    5      3      2
2                    4      2      2
Ответ принят как подходящий

Это можно решить в два этапа:

  1. Сводные итоги по группе и обновление dataset
  2. Измените формат с длинного на широкоформатный

с использованием data.table:

library(data.table)
dcast(setDT(dataset)[, total_count_of_group := .N, by =. (group1, group2)], 
      group1 + group2 + total_count_of_group~ paste0("var1 = ", var1), length)
   group1 group2 total_count_of_group var1_1 var1_2
1:      b      g                    4      2      2
2:      x      y                    5      3      2

Обратите внимание, что это будет работать для произвольного количества различных значений в var1, а также для произвольного количества групп.

library(tidyverse)

dataset %>%
  group_by(group1, group2) %>%             # for each combination of groups
  mutate(counts = n()) %>%                 # count number of rows
  count(group1, group2, var1, counts) %>%  # count unique combinations 
  spread(var1, n, sep = "_") %>%           # reshape dataset
  ungroup()                                # forget the grouping

# # A tibble: 2 x 5
#   group1 group2 counts var1_1 var1_2
#   <fct>  <fct>   <int>  <int>  <int>
# 1 b      g           4      2      2
# 2 x      y           5      3      2

Вот вариант с использованием base R

out <- aggregate(cbind(var = rep(1, nrow(df1))) ~ ., 
    transform(df1, counts = ave(var1, group1, group2, FUN = length)), length)
reshape(out, idvar = c('group1', 'group2', 'counts'),
     timevar= 'var1', direction= 'wide')
#   group1 group2 counts var.1 var.2
#1      b      g      4     2     2
#3      x      y      5     3     2

Вот решение для tidyverse:

library(tidyverse)
dataset %>%
  group_by(group1, group2) %>%
  summarize(total = n(), x = list(table(var1) %>% as_tibble %>% spread(var1,n))) %>%
  unnest

# # A tibble: 2 x 5
# # Groups:   group1 [2]
#   group1 group2 total   `1`   `2`
#   <fct>  <fct>  <int> <int> <int>
# 1 b      g          4     2     2
# 2 x      y          5     3     2

Другие вопросы по теме

Похожие вопросы