簡體   English   中英

使用 ggplot2 在 R 中繪制 Google Forms 復選框網格響應

[英]Plotting Google Forms checkbox grid responses in R using ggplot2

我收到了來自 Google Forms 調查問卷的 CSV output 調查表,並被要求在 ZE2831D9D405EZ201 中創建摘要圖。 但是,在分析鏈接圖像中的復選框網格的結果時,我遇到了一個主要的絆腳石: https://i.stack.imgur.com/0QXZb.png

每個參與者都被要求指定他們所有孩子的年齡。 兒童編號顯示在網格頂部(例如“兒童 1”、“兒童 2”等),而年齡組則顯示在左側下方的列中(例如 10-13、14-18 等)。 可以從網格中選擇多個響應,這讓我很頭疼。

當涉及到 CSV output 時,問題問題的結果已分開,以便它們出現在多個列中。 年齡段顯示為單獨的列,並且在一個單元格中可以出現多個響應(請參見下面的一個非常小的示例)。 真實數據集包含數百名參與者,並且根據多個標准對結果進行了子集化。

x10a.6.9          x10a.10.13        x10a.14.18        x10a.19.23 
child 2;child 3                     child 1
                  child 1
child 3;child 4   child 2                             child 1
                  child 1; child 2     

編輯:丑表的可復制版本(感謝鏈接 Mojoesque):

structure(list(x10a.6.9 = c("child 2;child 3", NA, "child 3;child 4", 
NA), x10a.10.13 = c(NA, "child 1", "child 2", "child 1;child 2"
), x10a.14.18 = c("child 1", NA, NA, NA), x10a.19.23 = c(NA, 
NA, "child 1", NA)), row.names = c(NA, -4L), class = "data.frame")

我想知道我將如何重塑這些數據,以便它可以在簡單的條形圖中顯示。 我不知道如何安排這些數據以使其與 ggplot2 合作。 如果可能的話,我希望它看起來像Google Forms 中生成的摘要圖像 就目前而言,我不知道如何將這樣的數據用於 plot 沿 x 軸的年齡並沿 y 軸計數。 我想在附圖中為每個子編號分別顯示此內容,但不知道從哪里開始。

任何和所有的幫助將不勝感激。 如果問題措辭不當,我深表歉意,並為我令人難以置信的天真道歉。

編輯:分辨率

我玩了一點,想出了我想要的 plot 的方法。 我將發布下面使用的步驟,以防它們對其他人有用。

在下面的代碼中,data_to_split 對應於上面顯示的表的小片段。

library(tidyr)
library(dplyr)
library(ggplot2)
data_split <- data_to_split %>% separate_rows(x10a.6.9:x10a.19.23, sep = ";") %>% 
   select(x10a.6.9:x10a.19.23) %>% na_if(., "") %>%
   mutate_all(funs(as.factor))

有必要使用 tidyr 中的separate_rows function,因為一個單元格內可能會發生多個響應(例如,一個單元格可以讀取“孩子 1;孩子 2”)分隔符“;” 用於將這些單元格拆分為多行。

na_if 用於將讀取為因子的空格轉換為 NA 值。

在下面的代碼中,添加了新列。 這些列只是為已讀入 R 的列提供了新名稱。 舊的很丑,更難處理。

data_split$`6-9` <- data_split$x10a.6.9
data_split$`10-13` <- data_split$x10a.10.13
data_split$`14-18` <- data_split$x10a.14.18
data_split$`19-23` <- data_split$x10a.19.23

在下面的前兩行代碼中,選擇了所有包含年齡段的相關列。 然后將數據從寬格式轉換為長格式。 在第三行中,na 值被刪除,因為我不想顯示它們。 Tally() 用於獲取可用於沿 y 軸顯示計數的 n 值。 在第四行中,有必要對年齡括號重新排序,以便它們按時間順序沿 x 軸顯示。 線條的 rest 幫助開發了基本的條形圖。

age_plot <- data_split %>% select(`6-9`:`19-23`) %>%
   pivot_longer(., cols = c(`6-9`:`19-23`), names_to = "Var", values_to = "Val") %>%
   drop_na() %>% group_by(Var, Val) %>% tally() %>%
   ggplot(aes(x = factor(Var, level = c("6-9", "10-13", "14-18", "19-23")), y = n, 
   fill = factor(Val, level = c("child 1", "child 2", "child 3", "child 4")))) +
   geom_bar(stat = "identity", position = position_dodge(width = 0.9)) +
   theme_classic() + labs(fill = "Child", x = "Age", y = "Number")

age_plot

結果看起來像這樣 (很明顯,這個圖表看起來有點奇怪,數據點這么少,但真實的東西看起來不錯!)

更新:“geom_bar”中的“position_dodge”更改為“position_dodge2”和“preserve = 'single'”,以便每個單獨的條現在具有相同的寬度。

答案在問題主體內,但也粘貼在這里,以防萬一。

在下面的代碼中,data_to_split 對應於問題中顯示的表的小片段。

可復制版本:

structure(list(x10a.6.9 = c("child 2;child 3", NA, "child 3;child 4", 
NA), x10a.10.13 = c(NA, "child 1", "child 2", "child 1;child 2"
), x10a.14.18 = c("child 1", NA, NA, NA), x10a.19.23 = c(NA, 
NA, "child 1", NA)), row.names = c(NA, -4L), class = "data.frame")
    library(tidyr)
    library(dplyr)
    library(ggplot2)
    data_split <- data_to_split %>% 
    separate_rows(x10a.6.9:x10a.19.23, sep = ";") %>% 
    select(x10a.6.9:x10a.19.23) %>% na_if(., "") %>%
    mutate_all(funs(as.factor))

有必要使用 tidyr 中的separate_rows function,因為一個單元格內可能會發生多個響應(例如,一個單元格可以讀取“孩子 1;孩子 2”)分隔符“;” 用於將這些單元格拆分為多行。

na_if 用於將讀取為因子的空格轉換為 NA 值。

在下面的代碼中,添加了新列。 這些列只是為已讀入 R 的列提供了新名稱。 舊的很丑,更難處理。

    data_split$`6-9` <- data_split$x10a.6.9
    data_split$`10-13` <- data_split$x10a.10.13
    data_split$`14-18` <- data_split$x10a.14.18
    data_split$`19-23` <- data_split$x10a.19.23

在下面的前兩行代碼中,選擇了所有包含年齡段的相關列。 然后將數據從寬格式轉換為長格式。 在第三行中,na 值被刪除,因為我不想顯示它們。 Tally() 用於獲取可用於沿 y 軸顯示計數的 n 值。 在第四行中,有必要對年齡括號重新排序,以便它們按時間順序沿 x 軸顯示。 線條的 rest 幫助開發了基本的條形圖。

age_plot <- data_split %>% select(`6-9`:`19-23`) %>%
       pivot_longer(., cols = c(`6-9`:`19-23`), names_to = "Var",  values_to = "Val") %>%
       drop_na() %>% group_by(Var, Val) %>% tally() %>%
       ggplot(aes(x = factor(Var, level = c("6-9", "10-13", "14-18", "19-23")), y = n, 
       fill = factor(Val, level = c("child 1", "child 2", "child 3", "child 4")))) +
       geom_bar(stat = "identity", position = position_dodge2(width = 0.9, preserve = "single")) +
       theme_classic() + labs(fill = "Child", x = "Age", y = "Number")

age_plot

結果看起來像這樣 (很明顯,這個圖表看起來有點奇怪,數據點這么少,但真實的東西看起來不錯!)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM