কিভাবে এক্সএমএল থেকে আর ডেটা ফ্রেম পার্স করবেন


103

আমি এক্সএমএল থেকে আর ডেটা ফ্রেমে পার্স করার চেষ্টা করেছি, এই লিঙ্কটি আমাকে অনেক সহায়তা করেছে:

একটি এক্সএমএল ফাইল থেকে কীভাবে আর ডেটা ফ্রেম তৈরি করবেন

তবে তবুও আমি আমার সমস্যাটি সনাক্ত করতে পারিনি:

আমার কোডটি এখানে:

data <- xmlParse("http://forecast.weather.gov/MapClick.php?lat=29.803&lon=-82.411&FcstType=digitalDWML")
xmlToDataFrame(nodes=getNodeSet(data1,"//data"))[c("location","time-layout")]
step1 <- xmlToDataFrame(nodes=getNodeSet(data1,"//location/point"))[c("latitude","longitude")]
step2 <- xmlToDataFrame(nodes=getNodeSet(data1,"//time-layout/start-valid-time"))
step3 <- xmlToDataFrame(nodes=getNodeSet(data1,"//parameters/temperature"))[c("type="hourly"")]

আমি যে ডেটা ফ্রেমটি রাখতে চাই তা হ'ল:

latitude  longitude   start-valid-time   hourly_temperature
29.803     -82.411  2013-06-19T15:00:00-04:00    91
29.803     -82.411  2013-06-19T16:00:00-04:00    90

আমি আটকে আছি xmlToDataFrame(), যে কোনও সহায়তা খুব প্রশংসা হবে, ধন্যবাদ

উত্তর:


103

এক্সএমএল ফর্ম্যাটে ডেটা খুব কমই এমনভাবে সংগঠিত হয় যা xmlToDataFrameফাংশনটি কাজ করতে দেয় । আপনি তালিকাগুলির সমস্ত কিছু বের করে নেওয়া এবং তারপরে তালিকাগুলিকে ডেটা ফ্রেমে একসাথে বাঁধাই ভাল better

require(XML)
data <- xmlParse("http://forecast.weather.gov/MapClick.php?lat=29.803&lon=-82.411&FcstType=digitalDWML")

xml_data <- xmlToList(data)

আপনার উদাহরণের ডেটার ক্ষেত্রে, অবস্থান পাওয়া এবং শুরুর সময় মোটামুটি সহজবোধ্য:

location <- as.list(xml_data[["data"]][["location"]][["point"]])

start_time <- unlist(xml_data[["data"]][["time-layout"]][
    names(xml_data[["data"]][["time-layout"]]) == "start-valid-time"])

তাপমাত্রার ডেটা কিছুটা জটিল। প্রথমে আপনাকে নোডে পৌঁছাতে হবে যা তাপমাত্রার তালিকা রয়েছে। তারপরে আপনার উভয় তালিকাগুলি নিষ্ক্রিয় করতে হবে, প্রতিটিগুলির মধ্যে সন্ধান করুন এবং "মানানসই" এর মান হিসাবে এটি চয়ন করুন। তারপরে আপনাকে কেবল সেই তালিকাটি নির্বাচন করতে হবে তবে কেবলমাত্র "মান" লেবেলযুক্ত মান রাখতে হবে:

temps <- xml_data[["data"]][["parameters"]]
temps <- temps[names(temps) == "temperature"]
temps <- temps[sapply(temps, function(x) any(unlist(x) == "hourly"))]
temps <- unlist(temps[[1]][sapply(temps, names) == "value"])

out <- data.frame(
  as.list(location),
  "start_valid_time" = start_time,
  "hourly_temperature" = temps)

head(out)
  latitude longitude          start_valid_time hourly_temperature
1    29.81    -82.42 2013-06-19T16:00:00-04:00                 91
2    29.81    -82.42 2013-06-19T17:00:00-04:00                 90
3    29.81    -82.42 2013-06-19T18:00:00-04:00                 89
4    29.81    -82.42 2013-06-19T19:00:00-04:00                 85
5    29.81    -82.42 2013-06-19T20:00:00-04:00                 83
6    29.81    -82.42 2013-06-19T21:00:00-04:00                 80

94

পারফরম্যান্স এবং স্পষ্টতা উভয়ের জন্য আরও সরাসরি এক্সপথ ব্যবহার করুন ।

time_path <- "//start-valid-time"
temp_path <- "//temperature[@type='hourly']/value"

df <- data.frame(
    latitude=data[["number(//point/@latitude)"]],
    longitude=data[["number(//point/@longitude)"]],
    start_valid_time=sapply(data[time_path], xmlValue),
    hourly_temperature=as.integer(sapply(data[temp_path], as, "integer"))

নেতৃস্থানীয়

> head(df, 2)
  latitude longitude          start_valid_time hourly_temperature
1    29.81    -82.42 2014-02-14T18:00:00-05:00                 60
2    29.81    -82.42 2014-02-14T19:00:00-05:00                 55

12
এটি সত্যই গ্রহণযোগ্য উত্তর হওয়া উচিত। এটি আরও সংক্ষিপ্ত এবং এক্সপ্যাথের তালিকাগুলির মাধ্যমে পুনরাবৃত্ত হওয়ার চেয়ে আরও ভাল পারফরম্যান্স রয়েছে।
SchaunW

39

এখানে এক্সএমএল 2 ব্যবহার করে একটি আংশিক সমাধান দেওয়া হয়েছে। সমাধানটিকে ছোট ছোট টুকরো টুকরো করে ভাঙার ফলে সবকিছু লাইন রেখেছে তা নিশ্চিত করা সহজ হয়:

library(xml2)
data <- read_xml("http://forecast.weather.gov/MapClick.php?lat=29.803&lon=-82.411&FcstType=digitalDWML")

# Point locations
point <- data %>% xml_find_all("//point")
point %>% xml_attr("latitude") %>% as.numeric()
point %>% xml_attr("longitude") %>% as.numeric()

# Start time
data %>% 
  xml_find_all("//start-valid-time") %>% 
  xml_text()

# Temperature
data %>% 
  xml_find_all("//temperature[@type='hourly']/value") %>% 
  xml_text() %>% 
  as.integer()

8
সহায়ক উত্তর। অন্য কেউ যদি এর ওপাশে হোঁচট খায় তবে xML2 ব্যবহার করে হ্যাডলির একটি টিউটোরিয়ালটির লিঙ্কটি এখানে রয়েছে: blog.rstudio.com/2015/04/21/xML2
রিচার্ড ইরিকসন

9

আপনি নীচের কোড চেষ্টা করতে পারেন:

# Load the packages required to read XML files.
library("XML")
library("methods")

# Convert the input xml file to a data frame.
xmldataframe <- xmlToDataFrame("input.xml")
print(xmldataframe)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.