Как я могу рассчитать общее количество каждого фактора в R

#r

Вопрос:

Я имею дело с результатом веб-опроса.

Код выглядит так:

 dat <- data.frame(
group = rep(LETTERS[1:3], times = 2),
choose = c("1,3,4,5", "1,2,3,4,5", "2,3,5", "4", "3,4,5", "2,5"))
 

Конечно, приведенный выше код показывает только упрощенную модель моего набора данных.

     library(tidyverse)
    new_dat <- dat %>%  
    separate(choose, c("C1","C2","C3","C4","C5"),sep = ",")
    columnindex1 <- 1:6
    new_dat[, columnindex1]<-lapply(new_dat[, columnindex1], factor)
 

На выходе получается следующее:

     group C1   C2   C3   C4   C5    
    A  1    3    4    5 <NA>    
    B  1    2    3    4    5    
    C  2    3    5 <NA> <NA>    
    A  4 <NA> <NA> <NA> <NA>    
    B  3    4    5 <NA> <NA>    
    C  2    5 <NA> <NA> <NA>
 

C1-C5 означают порядок ответов, который сделали участники. Например, участник № 1. сделал выбор № 1.,3., 4. и 5.. Теперь я хочу рассчитать общее количество вариантов каждого выбора по группам участников, например, один раз выбрал C1, но не выбрал C2; поэтому я преобразовал все числа от C1 до C5 в коэффициент.

Наконец, я надеюсь получить результат, который покажет, что участники группы А выбрали 1 Вариант № 1s, 2 варианта № 4s.

Тогда, может ли кто-нибудь, пожалуйста, сказать мне, как сделать это с помощью программирования в R studio? ——————-Обновление———————-

Спасибо за ваши советы и комментарии, я разобрался в этом с вашей помощью.

 df%>%
  pivot_longer(-group) %>%
  group_by(group,value) %>%
  summarise(n = n(), .groups = "keep")%>%
  na.omit()%>%
  pivot_wider(names_from = group, values_from = n)%>%
  replace_na(list('A' = 0L))
 

Комментарии:

1. @MrFlick Приносим извинения за причиненные неудобства. Я пойду, чтобы узнать, как разместить более удобный для тестирования вопрос. И «А»,»В», «С» совпадают с группой на первом рисунке. Я помечаю их буквой ABC.

2. Как A, B и C связаны с группами в первом столбце? И зачем вам преобразовывать числовые столбцы в коэффициенты, если вы хотите их добавить?

3. @camille A, B и C-это просто ярлыки групп на первой картинке. На самом деле цифры в столбце-это выбор в опросе. 4 означает, что участник выбрал № 4, поэтому я преобразовал их в коэффициенты и хочу рассчитать общее количество каждого выбора по группам

4. На вашем первом рисунке показаны только 2 группы, и все еще неясно, как вы хотите переходить от одного стола к другому. Вот почему необходимы воспроизводимые примеры

5. @камилла, спасибо тебе за твой совет. Я попытался отредактировать его с помощью более воспроизводимого.

Ответ №1:

Вот tidyverse решение

Код

 library(tidyverse)

df %>%
  #Grouping by New_group
  group_by(New_Group) %>% 
  #Apply the function sum (removing NA) from columns C1 to C7
  summarise(across(.cols = C1:C7,.fns = ~sum(.,na.rm = T))) %>%
  #Format data 
  pivot_longer(cols = -New_Group,names_to = "Choice") %>% 
  pivot_wider(names_from = New_Group,values_from = value)
 

Результат

   Choice `high prep` `no prep`
  <chr>        <int>     <int>
1 C1               8         2
2 C2              14         3
3 C3              18         5
4 C4              23         0
5 C5              16         0
6 C6               8         0
7 C7               0         0
 

Комментарии:

1. Спасибо вам за вашу помощь. Я попробовал ваш код, но ошибка сказала мне: «Ошибка: across() должна использоваться только внутри глаголов dplyr». Я не знаю, почему это произошло.

2. @NKevindid вы используете across() внутри summarise или mutate ?

Ответ №2:

Вы можете попробовать(я перешел group на New_group )

 new_dat %>%
  melt(id.vars = 'New_group') %>%
  group_by(New_group, variable, value) %>%
  summarise( n = n()) %>%
  na.omit

   New_group variable value     n
   <fct>     <fct>    <chr> <int>
 1 A         C1       1         1
 2 A         C1       4         1
 3 A         C2       3         1
 4 A         C3       4         1
 5 A         C4       5         1
 6 B         C1       1         1
 7 B         C1       3         1
 8 B         C2       2         1
 9 B         C2       4         1
10 B         C3       3         1
11 B         C3       5         1
12 B         C4       4         1
13 B         C5       5         1
14 C         C1       2         2
15 C         C2       3         1
16 C         C2       5         1
17 C         C3       5         1
 

Ответ №3:

Кажется, что самый прямой способ-изменить ваши данные. Если вы это сделаете

 library(dplyr)
library(tidyr)
df %>% 
  pivot_longer(-New_Group) %>% 
  count(name, New_Group) %>% 
  pivot_wider(names_from=New_Group, values_from=n)
 

В результате получается

    name  `high prep` `no prep`
   <chr>       <int>     <int>
 1 C1              3         1
 2 C10             3         1
 3 C2              3         1
 4 C3              3         1
 5 C4              3         1
 6 C5              3         1
 7 C6              3         1
 8 C7              3         1
 9 C8              3         1
10 C9              3         1