[英]Convert JSON-Array to r-column
關於如何將 JSON 數據轉換為 R,我有一個非常具體的問題。 我正在處理來自反應時間測試的數據。 數據包含一些關於 id、gender 和 age 的基本格式,格式為 csv。 但是,反應任務的數據以 JSON 數組的形式提供,具有以下結構:[“刺激 1”、“刺激 2”、選擇的答案、反應時間]。
這是數據外觀的示例,只是為了讓您了解它的基本概念(除了 JSON 數組實際上在原始數據中要長得多)
id gender age reaction_task
HU3 male 34 [["prime1", "target2", 1, 1560], ["prime7", "target6", 2, 1302], ["prime4", "target5", 2, 996]]
我是 R 的新手,並正在尋找一種方法將此 JSON 數組轉換為多個 R 列 - 例如像這樣:
trial1_stimulus1 trial1_stimulus2 trial1_answer trial1_time trail2_stimulus1 trial2_stimulus2 etc
prime1 target2 1 1560 prime7 target2
我發現了如何使用以下命令將數據與另一個數據分開:
df <- cbind(df, read.table(text = as.character(df$reaction_task), sep = ",", fill=TRUE) )
它有效,但結果非常費力,因為我仍然不得不手動從數據中刪除[]
。 所以我想知道是否有更順暢的方法來處理這項任務?
我也在嘗試以下代碼,但收到錯誤消息:
purrr::map_dfr(sosci$A101oRAW, jsonlite::fromJSON)
Fehler: parse error: premature EOF
(right here) ------^
謝謝你的幫助!
編輯:非常感謝 Maydin 提供的答案,它適用於示例數據,但是當數據框包含多個人時:我收到與以前幾乎相同的錯誤警告:
id <- c("HU3", "AB0", "IO9")
gender <- c("male", "female", "male")
age <-c(34, 87, 23)
task <- c("[[\"prime1\", \"target2\", 2, 1529], [\"prime7\", \"target6\", 2, 829], [\"prime4\", \"target5\", 1, 1872]]", "[[\"prime1\", \"target2\", 1, 1560], [\"prime7\", \"target6\", 2, 1302], [\"prime4\", \"target5\", 2, 996]]","[[\"prime1\", \"target2\", 1, 679], [\"prime7\", \"target6\", 1, 2090], [\"prime4\", \"target5\", 1, 528]]")
df <- data.frame(id, gender, age, task)
library(jsonlite)
library(dplyr)
df2 <- data.frame(df[,1:3],fromJSON(as.character(df[,"task"])))
parse error: trailing garbage
rime4", "target5", 1, 1872]] [["prime1", "target2", 1, 1560]
(right here) ------^
library(jsonlite)
df2 <- lapply(1:nrow(df), function(x) {
data.frame(df[x,1:3],fromJSON(as.character(df[x,"task"])),
row.names = NULL) })
df2 <- do.call(rbind,df2)
df2
id gender age X1 X2 X3 X4
1 HU3 male 34 prime1 target2 2 1529
2 HU3 male 34 prime7 target6 2 829
3 HU3 male 34 prime4 target5 1 1872
4 AB0 female 87 prime1 target2 1 1560
5 AB0 female 87 prime7 target6 2 1302
6 AB0 female 87 prime4 target5 2 996
7 IO9 male 23 prime1 target2 1 679
8 IO9 male 23 prime7 target6 1 2090
9 IO9 male 23 prime4 target5 1 528
我認為上面的 output 格式更好,但是如果您想將其轉換為列,
library(tidyr)
pivot_wider(data = df2,
id_cols = c("id","gender","age"),
names_from = c("X1","X2","X3","X4"),
values_from =c("X1","X2","X3","X4")) %>% as.data.frame()
如果以后需要,可以使用colnames()
等更改列的名稱。
數據:
df <- structure(list(id = structure(1L, .Label = "HU3", class = "factor"),
gender = structure(1L, .Label = "male", class = "factor"),
age = structure(1L, .Label = "34", class = "factor"), reaction_task = structure(1L, .Label = "[[\"prime1\", \"target2\", 1, 1560], [\"prime7\", \"target6\", 2, 1302], [\"prime4\", \"target5\", 2, 996]]", class = "factor")), class = "data.frame", row.names = c(NA,
-1L))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.