R tidyr распределить столбцы по всем категориям данной переменной - PullRequest
0 голосов
/ 21 сентября 2018

Я работаю над набором данных, который выглядит следующим образом.

#Dataframe
df=data.frame(Type=c(1,2,4,5,4,3,3,4,5,1,2,3,2,1,2,3,3,2,1,1,NA),
          Q1=c(1,2,6,8,9,10,2,6,7,4,9,9,1,2,NA,4,3,8,7,6,4),
          Q2=c(1,2,4,NA,8,2,1,2,10,7,5,5,5,8,2,7,4,8,7,5,1))

Контекст

Кадр данных состоит из результатов вопросника.

В первом столбце Type указывается тип сотрудника, ответившего на вопросник, где 1 = 'Worker', 2 = 'Factory Lead', 3 = 'Administrative Staff', 4 = 'Middle Management '& 5 =' Executive '

Второй и третий столбцы (Q1 & Q2) - это вопросы, оцениваемые по шкале от 1 =' Strongly Agree 'до 10 (Strongly Disagree).

Что я пытаюсь достичь

Я хотел бы рассчитать общее количество ответов на Type на основе оценки.Я создал бункеры для результатов, и они -

1) Low Соглашение - баллы от 0 до 4

2) Medium Соглашение - баллы 5 или 6

3) High Соглашение - Баллы 7 или 8

4) Very High Соглашение - Баллы 9 или 10

Так что я бы хотел посчитать количествоответов на одного работника на каждый бин.

Моя попытка

library(dplyr)
library(tidyr)

result=df %>%
gather(Item,response,-1) %>%
filter(!is.na(response)) %>%
group_by(Type,Item) %>%
filter(!is.na(Type)) %>%
summarise(Low=sum(response %in% c(0,1,2,3,4)),
        Medium=sum(response %in% c(5,6)),
        High=sum(response %in% c(7,8)),
        VHigh=sum(response %in% c(9,10)) %>%
spread(Type,-Item)

Моя логика заключается в том, что я использую библиотеку tidyr и первые gather баллы для вычисления общего количества ответов,Затем распределите столбцы так, чтобы у меня были промежуточные итоги по работникам и категориям оценок.

Например, для Q1, столбец для итоговых ответов для Low-Worker, затем Medium-Worker, затем High-Worker, затем Very High-Worker, затем Low-Factory Lead, затем Medium-Factory Lead .... и т. д. для всех комбинаций сотрудников и категорий баллов.

Очевидно, что-то не так в моем коде.

Желаемый результат

Кадр данных с двумя строками (Q1 & Q2) и 20 столбцами (для каждого сотрудника)комбинация))

Любая помощь по этому вопросу будет высоко оценен.

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

Создание фрейма данных с оценками

library(tidyr)
library(dplyr)
df <- data_frame(type=c(1,2,4,5,4,3,3,4,5,1,2,3,2,1,2,3,3,2,1,1,NA),
                 q1=c(1,2,6,8,9,10,2,6,7,4,9,9,1,2,NA,4,3,8,7,6,4),
                 q2=c(1,2,4,NA,8,2,1,2,10,7,5,5,5,8,2,7,4,8,7,5,1))

scores <- data_frame(score = 0:10,
                     scorebin = c(rep("Low", 5),
                                  rep("Medium", 2),
                                  rep("High", 2),
                                  rep("Very High", 2)))

Сбор данных в длинном формате.Присоединитесь к фрейму данных результатов, чтобы добавить столбец scorebin.Сгруппируйте по item, type и scorebin и посчитайте количество ответов в каждой группе.

df2 <- df %>%
    gather(item, score, -type) %>% 
    left_join(scores, by = "score") %>% 
    group_by(item, type, scorebin) %>% 
    summarise(n = n()) %>% 
    unite(employeescore, type, scorebin)

Измените employeescore на коэффициент с упорядоченными уровнями, чтобы они отображались не в алфавитном порядке (высокий, низкий, средний), а в правильном порядке (низкий, средний, высокий).

employeescoreorder <- scores %>% 
    distinct(scorebin) %>% 
    merge(distinct(df, type)) %>% 
    unite(employeescore, type, scorebin)
df2$employeescore <- factor(df2$employeescore, 
                            levels = employeescoreorder$employeescore)

Распространение фрейма данных в широком формате для получения 20 столбцов.

df2 %>% 
    spread(employeescore, n)

# A tibble: 2 x 20
# Groups:   item [2]
   item `1_Low` `1_Medium` `1_High` `2_Low` `2_Medium` `2_High` `2_Very High` `4_Low`
* <chr>   <int>      <int>    <int>   <int>      <int>    <int>         <int>   <int>
1    q1       3          1        1       2         NA        1             1      NA
2    q2       1          1        3       2          2        1            NA       2
# ... with 11 more variables: `4_Medium` <int>, `4_High` <int>, `4_Very High` <int>,
#   `5_High` <int>, `5_Very High` <int>, `3_Low` <int>, `3_Medium` <int>, `3_High` <int>,
#   `3_Very High` <int>, NA_Low <int>, `<NA>` <int>
0 голосов
/ 21 сентября 2018

Другое решение, похожее на Paul Rougieux, но без объединений:

df %>% 
  mutate(Type = case_when(Type == 1 ~ "Worker",
                          Type == 2 ~ "Factory Lead",
                          Type == 3 ~ "Administrative Staff",
                          Type == 4 ~ "Middle Management",
                          Type == 5 ~ "Executive")) %>% 
  mutate_at(c("Q1", "Q2"), 
            funs(case_when(. %in% 1:4 ~ "Low",
                           . %in% 5:6 ~ "Medium",
                           . %in% 7:8 ~ "High",
                           . %in% 9:10 ~ "Very High"))) %>%
  gather(Questions, Score, Q1:Q2) %>% 
  unite(Type_Score, Type, Score, sep = "_") %>% 
  count(Questions, Type_Score) %>% 
  spread(Type_Score, n)

# A tibble: 2 x 21
#   Questions `Administrative~ `Administrative~ `Administrative~ `Administrative~ Executive_High Executive_NA `Executive_Very~ `Factory Lead_H~
#   <chr>                <int>            <int>            <int>            <int>          <int>        <int>            <int>            <int>
# 1 Q1                      NA                3               NA                2              2           NA               NA                1
# 2 Q2                       1                3                1               NA             NA            1                1                1
# ... with 12 more variables: `Factory Lead_Low` <int>, `Factory Lead_Medium` <int>, `Factory Lead_NA` <int>, `Factory Lead_Very High` <int>,
#   `Middle Management_High` <int>, `Middle Management_Low` <int>, `Middle Management_Medium` <int>, `Middle Management_Very High` <int>,
#   NA_Low <int>, Worker_High <int>, Worker_Low <int>, Worker_Medium <int>
0 голосов
/ 21 сентября 2018

Как это?

 df%>%
   mutate(Type_real=case_when(
             Type==1~"Worker",
             Type==2~"Factory Lead",
             Type==3~"Administrative Staff",
             Type==4~"Middle Management",
             Type==5~"Executive"),
         Score=case_when(
             Q1<5~"Low",
             Q1>=5 & Q1<=6~"Medium",
             Q1>=7 & Q1<=8~"High",
             Q1>8~"Very High"))%>%
   na.omit()%>%
   group_by(Type_real,Score)%>%
   summarise(count=n())
# A tibble: 11 x 3
# Groups:   Type_real [?]
   Type_real            Score     count
   <chr>                <chr>     <int>
 1 Administrative Staff Low           3
 2 Administrative Staff Very High     2
 3 Executive            High          1
 4 Factory Lead         High          1
 5 Factory Lead         Low           2
 6 Factory Lead         Very High     1
 7 Middle Management    Medium        2
 8 Middle Management    Very High     1
 9 Worker               High          1
10 Worker               Low           3
11 Worker               Medium        1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...