#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