2016-04-06 1 views
1

Я пытаюсь прочитать формат файла YAML для данных, расположенных по адресу here, используя нижеприведенные команды, но оба не предоставили данные в требуемом формате вывода, например, файлы CSV, расположенные here. Описание данных в файлах YAML составляет here или быстро, вы можете напрямую обратиться к формату, указанному в конце.Ошибка чтения файлов YAML в качестве фрейма данных в R

Я попытался загрузить данные, используя эти команды, но напрасно. Может ли кто-нибудь помочь мне правильно загрузить данные в файлах YAML в качестве R-данных или преобразовать их в csv в соответствии с указанным выше форматом вывода?

cric <- yaml.load_file("911047.yaml") 
cric <- data.frame(yaml.load_file("211028.yaml")) 

Я даю высокий формат уровня данных ниже для быстрой исх (К сожалению, оригинальный формат YAML код исчезает при вставке здесь, я не мог понять способ вставки и переформатировать как есть) :

meta: 
    data_version: 0.6 
    created: 2013-02-22 
    revision: 1 
    info: 
    city: Southampton 
    dates: 
    - 2005-06-13 
    match_type: T20 
    outcome: 
    by: 
     runs: 100 
    winner: England 
    overs: 20 
    player_of_match: 
     - KP Pietersen 
    teams: 
     - England 
     - Australia 
    toss: 
     decision: bat 
     winner: England 
    umpires: 
    - NJ Llong 
    - JW Lloyds 
    venue: The Rose Bowl innings: 
    - 1st innings: 
     team: England 
     deliveries: 
     - 0.1: 
      batsman: ME Trescothick 
      bowler: B Lee 
      non_striker: GO Jones 
      runs: 
       batsman: 0 
       extras: 0 
       total: 0 
+1

Вы не сможете быстро преобразовать это в data.frame, потому что данные не имеют естественной прямоугольной структуры. Вам придется написать собственную функцию синтаксического анализа, чтобы преобразовать ее в вектор, а затем «rbind()» вместе. – Thomas

ответ

1

может быть решена путем расплава из пакета reshape2

ниже код поможет

library(reshape2) 
library(reshape2) 
data = yaml.load_file("C:\\Users\\vsahu\\Downloads\\mdms\\911047.yaml") 
x = melt(data) 
y = data.frame(x) 

meta = y[y$L1 == 'meta',] 
meta = meta[, colSums(is.na(meta)) != nrow(meta)] 
data_meta = reshape(meta,direction = 'wide',timevar = 'L2',idvar = 'L1') 

info = y[y$L1 == 'info',] 
info = info[, colSums(is.na(info)) != nrow(info)] 
info = subset(data_innings, select=-c(L1)) 


data_innings = y[(y$L1 == 'innings') & (y$L4 == 'deliveries'),] 
data_innings$new = paste(data_innings$L7,data_innings$L8,sep="_") 
data_innings = subset(data_innings, select=-c(L7,L8,L4,L1,L5)) 
data_innings = reshape(data_innings,idvar=c('L2','L3','L6'),direction = "wide",timevar = c('new')) 
write.csv(data_innings,"data_innings.csv",row.names = F) 
0

Я отредактировал ответ Vaibhav выше, чтобы создать функцию, которая читает все файлы yaml в указанной директории и преобразует ее в csv. Он заботится о нескольких ошибках соответствия строк, вызванных изменением формы.

aggr_fielder <- function(x) { 
paste0(x, collapse="/") 
} 

convertCricsheetData <- function(source = ".",destination = ""){ 
require(yaml) 
require(reshape2) 
require(data.table) 
all.files <- list.files(path = source, 
         pattern = ".yaml", 
         full.names = TRUE) 

for (i in 1:length(all.files)) { 
    data = yaml.load_file(all.files[i]) 
    x = melt(data) 
    y = data.table(x) 

    meta = y[y$L1 == 'meta',] 
    meta = meta[, colSums(is.na(meta)) != nrow(meta), with=FALSE] 
    data_meta = reshape(meta,direction = 'wide',timevar = 'L2',idvar = 'L1') 

    info = y[y$L1 == 'info',] 
    info = info[, colSums(is.na(info)) != nrow(info), with=FALSE] 
    info[, L1 := NULL] 
    info[,match_no := i] 

    data_innings = y[(y$L1 == 'innings') & (y$L4 == 'deliveries'),] 
    data_innings[, new := paste(data_innings$L7,data_innings$L8,sep="_")] 
    data_innings [, c("L7","L8","L4","L1","L5") := NULL] 
    data_innings = dcast(data_innings, L2+L3+L6 ~ new, fun.aggregate = aggr_fielder,fill = NA) 
    data_innings[,match_no := i] 
    write.csv(data_innings,paste0(destination,paste(c(info[info$L2 == "dates",]$value,info[info$L2 == "teams",]$value), collapse = "-"),".csv"),row.names = F) 
    write.csv(info,paste0(destination,paste(c("info",info[info$L2 == "dates",]$value,info[info$L2 == "teams",]$value), collapse = "-"),".csv"),row.names = F) 
    } 
}