การนำเข้าข้อมูลจากไฟล์ JSON ไปยัง R


166

มีวิธีการนำเข้าข้อมูลจากไฟล์ JSON ไปยัง R หรือไม่? โดยเฉพาะอย่างยิ่งไฟล์เป็นอาร์เรย์ของวัตถุ JSON ที่มีเขตข้อมูลสตริงวัตถุและอาร์เรย์ แพ็คเกจ RJSON นั้นไม่ชัดเจนมากเกี่ยวกับวิธีจัดการกับhttp://cran.r-project.org/web/packages/rjson/rjson.pdfนี้


3
ซ้ำ: stackoverflow.com/questions/2061897/parse-json-with-r หากคุณมีตัวอย่างข้อมูลเฉพาะนั่นจะช่วยได้ มิฉะนั้น rjson สามารถทำสิ่งที่คุณต้องการพร้อมกับการจัดการข้อมูล (เช่นใช้ฟังก์ชั่นหรือ plyr)
เชน

นอกจากนี้ยังคล้ายกับคำถามนี้: stackoverflow.com/questions/2260147/...
เชน

สวัสดีเชนลองใช้ RJSON ฉันสนใจการจัดการข้อมูลที่จำเป็นเป็นส่วนใหญ่ นี่คือตัวอย่างของไฟล์ JSON ที่ฉันใช้งาน example.json: [{"ผู้ชนะ": "68694999", "คะแนนโหวต": [{"ts": "พฤ 25 มีนาคม 03:13:01 UTC 2010", "ผู้ใช้": {"ชื่อ": "ลามูร์", "user_id": "68694999"}}, {"ts": "Thu Mar 25 03:13:08 UTC 2010", "ผู้ใช้": {"ชื่อ": "Lamur", "user_id": "68694999"}} ], "lastVote": {"timestamp": 1269486788526, "ผู้ใช้": {"name": "Lamur", "user_id": "68694999"}}, "startPrice": 0}, ... ]
user313967

1
ข้อควรระวัง: หากไฟล์ JSON มีขนาดใหญ่มากดูเหมือนว่าไลบรารี. so หรือ. dll จะไม่ประมวลผล รูปแบบที่นิยมคือ NetCDF แต่บางองค์กรไม่ทราบถึงปัญหานี้

คำตอบ:


187

ก่อนติดตั้งrjsonแพคเกจ:

install.packages("rjson")

แล้ว:

library("rjson")
json_file <- "http://api.worldbank.org/country?per_page=10&region=OED&lendingtype=LNX&format=json"
json_data <- fromJSON(paste(readLines(json_file), collapse=""))

อัปเดต:ตั้งแต่รุ่น 0.2.1

json_data <- fromJSON(file=json_file)

1
โปรดทราบว่าการแก้ไขหมายถึงการอัปเดตไปยังไลบรารีไม่ใช่อาร์การอัปเดตจะเปลี่ยนบรรทัดสุดท้ายของตัวอย่างก่อนหน้านี้และคุณยังต้องโหลดในไลบรารีดังกล่าวข้างต้น
Steven Waterman

90

jsonliteจะนำเข้า JSON ลงในกรอบข้อมูล มันอาจเลือกที่จะแผ่วัตถุที่ซ้อนกัน อาร์เรย์ที่ซ้อนกันจะเป็นเฟรมข้อมูล

> library(jsonlite)
> winners <- fromJSON("winners.json", flatten=TRUE)
> colnames(winners)
[1] "winner" "votes" "startPrice" "lastVote.timestamp" "lastVote.user.name" "lastVote.user.user_id"
> winners[,c("winner","startPrice","lastVote.user.name")]
    winner startPrice lastVote.user.name
1 68694999          0              Lamur
> winners[,c("votes")]
[[1]]
                            ts user.name user.user_id
1 Thu Mar 25 03:13:01 UTC 2010     Lamur     68694999
2 Thu Mar 25 03:13:08 UTC 2010     Lamur     68694999

แน่นอน! ง่ายต่อการใช้งานกับ data.frames แทนรายการเมื่อทำการกรองผลลัพธ์!
MS Berends

31

แพ็คเกจอื่นคือ RJSONIO ในการแปลงรายการที่ซ้อนกัน lapply สามารถช่วย:

l <- fromJSON('[{"winner":"68694999",  "votes":[ 
   {"ts":"Thu Mar 25 03:13:01 UTC 2010", "user":{"name":"Lamur","user_id":"68694999"}},   
   {"ts":"Thu Mar 25 03:13:08 UTC 2010", "user":{"name":"Lamur","user_id":"68694999"}}],   
  "lastVote":{"timestamp":1269486788526,"user":
   {"name":"Lamur","user_id":"68694999"}},"startPrice":0}]'
)
m <- lapply(
    l[[1]]$votes, 
    function(x) c(x$user['name'], x$user['user_id'], x['ts'])
)
m <- do.call(rbind, m)

ให้ข้อมูลเกี่ยวกับคะแนนโหวตในตัวอย่างของคุณ


1
x$user$name, x$user$user_idx$user['name'], x$user['user_id']ตอนนี้ควรจะเป็น นอกจากนี้m <- do.call(rbind, m)อาจเป็นวิธีที่ดีกว่าในการแปลงรายการเป็นเมทริกซ์
jbaums

มีบางอย่างเช่นฟังก์ชั่น convertToDataFrame สำหรับ JSON (เช่นมีสำหรับแพ็คเกจ XML)
userJT

16

หาก URL นั้นเป็น https เหมือนกับที่ใช้กับ Amazon S3 ให้ใช้ getURL

json <- fromJSON(getURL('https://s3.amazonaws.com/bucket/my.json'))

11
PSA: getURL อยู่ใน RCurl pacakge
Mark McDonald

1
นอกจากนี้Error in function (type, msg, asError = TRUE) : Protocol "s3" not supported or disabled in libcurl
d8aninja

3

ก่อนติดตั้งแพคเกจ RJSONIO และ RCurl:

install.packages("RJSONIO")
install.packages("(RCurl")

ลองรหัสด้านล่างโดยใช้ RJSONIO ในคอนโซล

library(RJSONIO)
library(RCurl)
json_file = getURL("https://raw.githubusercontent.com/isrini/SI_IS607/master/books.json")
json_file2 = RJSONIO::fromJSON(json_file)
head(json_file2)


2

แพคเกจ:

  • ห้องสมุด (httr)
  • ห้องสมุด (jsonlite)

ฉันมีปัญหาในการแปลง json เป็น dataframe / csv สำหรับกรณีของฉันฉันทำ:

Token <- "245432532532"
source <- "http://......."
header_type <- "applcation/json"
full_token <- paste0("Bearer ", Token)
response <- GET(n_source, add_headers(Authorization = full_token, Accept = h_type), timeout(120), verbose())
text_json <- content(response, type = 'text', encoding = "UTF-8")
jfile <- fromJSON(text_json)
df <- as.data.frame(jfile)

จาก df ถึง csv

ในรูปแบบนี้ควรแปลงเป็น. csv หลายรายการหากจำเป็น

type = 'text'ส่วนที่สำคัญคือฟังก์ชั่นเนื้อหาที่ควรจะมี


1

นำเข้าแพคเกจ httr

library(httr)

รับ URL

url <- "http://www.omdbapi.com/?apikey=72bc447a&t=Annie+Hall&y=&plot=short&r=json"
resp <- GET(url)

พิมพ์เนื้อหาของ resp เป็นข้อความ

content(resp, as = "text")

พิมพ์เนื้อหาของ resp

content(resp)

ใช้ content () เพื่อรับเนื้อหาของ resp แต่ครั้งนี้ไม่ได้ระบุอาร์กิวเมนต์ที่สอง R คิดออกโดยอัตโนมัติว่าคุณกำลังเผชิญกับ JSON และแปลง JSON เป็นรายการ R ที่มีชื่อ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.