2017-05-20 404 views
2

我有我認爲是一項基本任務,但已證明不然。我有一系列調查,我需要將其轉換爲每個調查的頻率表。例如,調查1包含6個問題,其中參與者有5個回答選項。對於每項調查,我需要製作一個包含每個問題(本例中有6個問題)的表格,以及每個問題的每個回答選項都回答的參與者的百分比。R李克特數據頻率表

我一直在使用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」行合併到同一行中表。

希望有所幫助。謝謝。

+1

請提供的示例數據和一些代碼,你試過。在Word文檔中生成表格可以使用RMarkdown來完成。 – Marius

+0

謝謝,請參閱我的編輯。 – Drew

+0

您可能會覺得這很有用:http://www.statmethods.net/stats/frequencies.html – Phil

回答

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


對不起,我開始寫我的例子你的編輯之前,希望你仍然可以自定義你的使用情況。

事實上,我似乎誤解了你的問題,並回答了一個不同的問題。

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

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 
+0

這並不壞,但是有沒有一種方法可以包含比例點'1',儘管沒有觀察將它包括在問題中? – Phil

+0

@Phil是的。要包含沒有觀察值的值,我們需要爲我們的比例添加值標籤。查看帖子的更新。 –