[英]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.