相似数据的R频率表

时间:2017-05-20 01:55:31

标签: r frequency-analysis

我认为这是一项基本任务,但已经证明不是这样。我有一系列调查需要转换成每个调查的频率表。例如,调查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”在结果表中作为行名称,我希望百分比具有%符号,并且我需要一种方法将两个额外的“q2”“q3”行合并到同一行中表

希望有所帮助。谢谢。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

ggplot grouped bar plot

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

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

答案 2 :(得分:0)

我不建议你这样做,因为它对以后的争吵没有用,但是为了让它完全按照要求......

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%

最后一段代码是建议的here