R tidyr набор () двух наборов столбцов на основе поиска - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть набор данных результатов исследования удовлетворенности по регионам.Каждый вопрос в опросе оценивается по 4-балльной шкале (от Очень доволен до Очень недоволен ).Каждая строка в наборе данных содержит агрегированный результат для данного вопроса в данном регионе в конце данного «финансового года».Он также содержит общее количество респондентов для каждого уровня.

Так выглядит набор данных

testdf=data.frame(FY=c("FY13","FY14","FY15","FY14","FY15","FY13","FY14","FY15","FY13","FY15","FY13","FY14","FY15","FY13","FY14","FY15"),
                  Region=c(rep("AFRICA",5),rep("ASIA",5),rep("AMERICA",6)),
                  QST=c(rep("Q2",3),rep("Q5",2),rep("Q2",3),rep("Q5",2),rep("Q2",3),rep("Q5",3)),
                  Very.Satisfied=runif(16,min = 0, max=1),
                  Total.Very.Satisfied=floor(runif(16,min=10,max=120)),
                  Satisfied=runif(16,min = 0, max=1),
                  Total.Satisfied=floor(runif(16,min=10,max=120)),
                  Dissatisfied=runif(16,min = 0, max=1),
                  Total.Dissatisfied=floor(runif(16,min=10,max=120)),
                  Very.Dissatisfied=runif(16,min = 0, max=1),
                  Total.Very.Dissatisfied=floor(runif(16,min=10,max=120))
                  )

Моя цель

Моя цельизменить форму набора данных из широкого в длинный формат, сначала создав столбец с именем Level (который указывает уровень по 4-балльной шкале).Затем создайте столбец с именем Score с агрегированными баллами и последний столбец с именем Total с общим количеством респондентов для каждого соответствующего уровня.

Моя попытка

До сих пор я только что смог gather уровней в один столбец и создать столбец Score.

#Gather Satisfation levels
library(tidyverse)
testfinal = testdf %>% gather(Level,Score,-FY:-QST,-Total.Very.Satisfied,-Total.Satisfied,-Total.Dissatisfied,-Total.Very.Dissatisfied) %>%
  select(1:3,8:9,4:7)

Яне в состоянии понять, как gather итогов в другом столбце , так что каждый итог во вновь созданном столбце Total соответствуетсвязанный с ним уровень.

Вот предварительный просмотр того, как будет выглядеть окончательный набор данных, если все пойдет хорошо

#FY   #Region  #QST  #Level            #Score        #Total
 FY13  AFRICA   Q2    Very.Satisfied    0.73080770    48
 FY14  AFRICA   Q2    Very.Satisfied    0.58686424    97
 FY15  AFRICA   Q2    Very.Satisfied    0.07358698    34
 FY14  AFRICA   Q5    Very.Satisfied    0.59996830    22

и так далее ...

Любые материалы будут высоко оценены.

1 Ответ

0 голосов
/ 31 декабря 2018

Это можно сделать проще с melt из data.table.Преобразуйте «data.frame» в «data.table» (setDT), melt из «wide» в «long», указав имя нескольких столбцов patterns в аргументе measure

library(data.table)
out <- melt(setDT(testdf), measure = patterns("^Total", 
     "^(Very|Satisfied|Dis)"), value.name = c("Total", "Score"), 
       variable.name = "Level")
nm1 <- names(testdf)[c(4, 6, 8, 10)]
out[, Level := nm1[Level]][]
head(out)
#     FY Region QST          Level Total      Score
#1: FY13 AFRICA  Q2 Very.Satisfied    85 0.36888202
#2: FY14 AFRICA  Q2 Very.Satisfied   108 0.67589979
#3: FY15 AFRICA  Q2 Very.Satisfied    13 0.90792351
#4: FY14 AFRICA  Q5 Very.Satisfied    52 0.01966743
#5: FY15 AFRICA  Q5 Very.Satisfied    59 0.68895083
#6: FY13   ASIA  Q2 Very.Satisfied    96 0.24912066

Или с использованием tidyverse

library(tidyverse)
testdf %>%
    gather(key, val, 4:ncol(.)) %>%
    extract(key, into = c("key1", "Level"), "(Total)?\\.?(.*)") %>%
    mutate(key1 = replace_na(key1, "Score")) %>%
    spread(key1, val)
#      FY  Region QST             Level      Score Total
#1  FY13  AFRICA  Q2      Dissatisfied 0.69226483    71
#2  FY13  AFRICA  Q2         Satisfied 0.91617425    26
#3  FY13  AFRICA  Q2 Very.Dissatisfied 0.64277110    43
#4  FY13  AFRICA  Q2    Very.Satisfied 0.36888202    85
#5  FY13 AMERICA  Q2      Dissatisfied 0.10219036    37
#6  FY13 AMERICA  Q2         Satisfied 0.28281065    26
#7  FY13 AMERICA  Q2 Very.Dissatisfied 0.59667659    90
#8  FY13 AMERICA  Q2    Very.Satisfied 0.30204224    76
# ....

ПРИМЕЧАНИЕ. Значения в «Всего», «Оценка» отличаются, так как при создании набора данных не было set.seed.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...