Таблица частот R данных Лайкерта

У меня есть то, что я считал основной задачей, но доказал обратное. У меня есть серия опросов, которые мне нужно преобразовать в частотные таблицы для каждого опроса. Например, опрос 1 состоит из 6 вопросов, на которые у участников было 5 вариантов ответа. Для каждого опроса мне нужно создать таблицу, в которой будет каждый вопрос (в этом примере их 6), а также процент участников, которые ответили с каждым вариантом ответа на каждый вопрос.

Я использовал prop.table, но мог сделать это только для одного вопроса за раз, и я не понял, как добавить знак процента, и я теряю заголовок переменной вопроса в имени строки.

В целом, я хотел бы распечатать эти таблицы прямо в текстовом документе. Эту часть, я думаю, я понял, но теперь мне нужно разобраться в таблицах.

Приветствую любые предложения. Спасибо!

ИЗМЕНИТЬ

Вот что я использовал до сих пор, используя некоторые образцы данных Лайкерта:

q1<-c(2,2,3,3,3,4,4,4,5,5)
q2<-c(2,3,3,4,4,4,4,5,5,5)
q3<-c(2,2,2,3,4,4,4,5,5,5)
df<-data.frame(q1,q2,q3)
x<-prop.table(table(factor(df$q1,levels=1:5)))*100
y<-round(x,digits=1)`

Это дает нечто похожее на то, что мне нужно. Однако я бы хотел, чтобы «q1» присутствовал в результирующей таблице как имя строки, я бы хотел, чтобы проценты имели знак%, и мне нужен способ включить две дополнительные строки «q2» и «q3» в ту же самую стол.

Надеюсь, это поможет. Спасибо.


person Drew    schedule 20.05.2017    source источник
comment
Пожалуйста, предоставьте примеры данных и код, который вы пробовали. Создание таблиц в текстовом документе можно выполнить с помощью RMarkdown.   -  person Marius    schedule 20.05.2017
comment
Спасибо, пожалуйста, посмотрите мою правку.   -  person Drew    schedule 20.05.2017
comment
Вы можете найти это полезным: statmethods.net/stats/frequencies.html   -  person Phil    schedule 20.05.2017


Ответы (3)


q1<-c(2,2,3,3,3,4,4,4,5,5)
q2<-c(2,3,3,4,4,4,4,5,5,5)
q3<-c(2,2,2,3,4,4,4,5,5,5)
df<-data.frame(q1,q2,q3)

library(expss)
# add value lables for preserving empty categories
val_lab(df) = autonum(1:5)
res = df
for(each in colnames(df)){
    res = res %>% 
        tab_cells(list(each)) %>% 
        tab_cols(vars(each)) %>% 
        tab_stat_rpct(total_row_position = "none")
}


res = res %>% tab_pivot() 
# add percentage sign
recode(res[,-1]) = other ~ function(x) ifelse(is.na(x), NA, paste0(round(x, 0), "%"))
res

# |    |  1 |   2 |   3 |   4 |   5 |
# | -- | -- | --- | --- | --- | --- |
# | q1 |    | 20% | 30% | 30% | 20% |
# | q2 |    | 10% | 20% | 40% | 30% |
# | q3 |    | 30% | 10% | 30% | 30% |

Если вы используете knitr, вам будет полезен следующий код:

library(knitr)
res %>% kable
person Gregory Demin    schedule 20.05.2017
comment
Это неплохо, но есть ли способ включить точку шкалы 1, даже если никакие наблюдения не включали ее в вопросы? - person Phil; 20.05.2017
comment
@ Фил Да. Чтобы включить значения без наблюдений, нам нужно добавить метки значений на наши шкалы. Смотрите обновление сообщения. - person Gregory Demin; 20.05.2017

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

for (i in seq_along(names(df))) {
 assign(paste0("x",i), prop.table(table(factor(df[[i]], levels = 1:5))))
}

result <- rbind(x1, x2, x3)
rownames(result) <- names(df)

as.data.frame(matrix(
sprintf("%.0f%%", result*100), 
nrow(result), 
dimnames = dimnames(result)
))

   1   2   3   4   5
q1 0% 20% 30% 30% 20%
q2 0% 10% 20% 40% 30%
q3 0% 30% 10% 30% 30%

Последний фрагмент кода предлагается здесь.

person Phil    schedule 20.05.2017

Трудно дать точный ответ, не зная, как выглядят данные. Однако, предполагая, что у меня уже есть какой-то фрейм данных, я бы начал с создания функций, которые систематически преобразовывали бы данные в графики. Я бы также использовал ggplot2 вместо базовой графики R, поскольку это было бы более гибким.


Предположим, у вас есть фреймы данных для каждого опроса. По моему опыту, у вас могут быть строки с одним столбцом, который указывает вопрос, а другой - с заданным ответом на этот вопрос.

То есть:

survey = data.frame(question = factor(rep(1:6,4)),response = factor(c(1:5,sample(1:5,19, replace = TRUE))))

Затем вы можете создать функцию, которая вычисляет процент для каждого ответа в вопросе с учетом фрейма данных выше.

library(plyr)

# Assumes survey has columns question and response
calculate_percent = function(survey){
  ddply(survey, ~question, function(rows){ 

  total_responses = nrow(rows)

  response_percent =  ddply(rows, ~response, function(rows_response){
    count_response = nrow(rows_response)
    data.frame(response = unique(rows_response$response), percent = (count_response/total_responses)*100)
  })

  data.frame(question = unique(rows$question), response_percent)

  })
}

Затем вы можете создать функцию, которая создает график с учетом фрейма данных, подобного определенному выше.

library(ggplot2)
library(scales)

percentage_plot = function(survey){

  calculated_percentages = calculate_percent(survey)

  ggplot(calculated_percentages,aes(x = question, y = percent)) + 
    geom_bar(aes(fill = response),stat = "identity",position = "dodge") +
    scale_y_continuous(labels = percent)
}

Что, наконец, можно использовать с вызовом

percentage_plot(survey)

Затем, поскольку у вас есть несколько опросов, вы можете обобщить их с помощью дополнительных функций, которые будут систематически обрабатывать данные таким же образом, как указано выше.

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


Использованная литература:

процент ggplot

сгруппированная столбчатая диаграмма ggplot


Извините, я начал писать свой пример до вашего редактирования, надеюсь, вы все еще можете настроить свой вариант использования.

На самом деле кажется, что я неправильно понял ваш вопрос и ответил на другой.

person kishan    schedule 20.05.2017