Likert数据的R频率表

Likert数据的R频率表,r,frequency-analysis,R,Frequency Analysis,我有我认为是一项基本任务,但事实证明并非如此。我有一系列的调查,我需要转换成频率表,为每个调查。例如,调查1由6个问题组成,参与者有5个回答选项。对于每个调查,我需要生成一个包含每个问题的表(在本例中有6个问题),以及每个问题每个回答选项的参与者百分比 我一直在使用prop.table,但一次只能对一个问题执行该操作,而且我还不知道如何添加百分号,因此我在行名称中丢失了问题变量标题 总的来说,我想将这些表直接打印到word文档中。这部分我想我已经弄明白了,但现在我需要弄清楚表格 我欢迎任何建议。

我有我认为是一项基本任务,但事实证明并非如此。我有一系列的调查,我需要转换成频率表,为每个调查。例如,调查1由6个问题组成,参与者有5个回答选项。对于每个调查,我需要生成一个包含每个问题的表(在本例中有6个问题),以及每个问题每个回答选项的参与者百分比

我一直在使用prop.table,但一次只能对一个问题执行该操作,而且我还不知道如何添加百分号,因此我在行名称中丢失了问题变量标题

总的来说,我想将这些表直接打印到word文档中。这部分我想我已经弄明白了,但现在我需要弄清楚表格

我欢迎任何建议。谢谢

编辑

以下是迄今为止我使用一些Likert样本数据得到的结果:

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如果不知道数据是什么样子,很难给出准确的答案。然而,假设我已经有了某种数据框架,我将从创建函数开始,该函数将系统地将数据转换为绘图。我也会使用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)

然后,由于您有多个调查,您可以使用其他功能进行概括,这些功能将以与上述类似的方式系统地处理数据

此外,您还可以在facet中进行上述绘图,而不是在此处进行分组框绘图。但是,由于您有多个调查,您可能希望在该级别使用方面


参考资料:


很抱歉,我在您编辑之前就开始编写我的示例,希望您仍然可以根据您的用例进行自定义


实际上,我似乎误解了你的问题,并回答了另一个问题。

我不建议你这样做,因为这对以后的争吵没有帮助,但为了让它完全符合要求

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%
for(i在seq_中沿(名称(df))){
分配(粘贴0(“x”,i),属性表(表(系数(df[[i]],级别=1:5)))
}

结果请提供示例数据和一些您尝试过的代码。在word文档中生成表格可以使用RMarkdown完成。谢谢,请查看我的编辑。您可能会发现这很有用:这还不错,但是有没有一种方法可以包括缩放点
1
,即使没有观察结果包括在问题中?@Phil Yes。要包含没有观测值的值,我们需要在标尺上添加值标签。请参阅文章的更新。
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% |
library(knitr)
res %>% kable