Прочитайте необработанные оценки VW от (CS) OAA

VowpalWabbit записывает необработанные прогнозы из модели (CS)OAA в виде последовательности строк, подобных этой:

1:-2.31425 2:-3.98557 3:-3.97967 4:-2.63708 5:-3.18749 6:-2.43984 7:-4.99018 8:-3.49138 9:-3.07816 10:-6.15126 11:-6.01152 12:-5.76039 13:-5.13096 14:-5.18472 15:-5.37358 16:-5.24147 17:-5.21512 18:-5.67961 19:-4.62929 20:-4.61404 000db8cd6aef4e5fa459126d36e0fa1f-none
1:-2.65864 2:-3.33924 3:-2.8116 4:-1.83108 5:-2.05677 6:-1.29879 7:-6.7446 8:-3.05036 9:-2.82138 10:-5.19605 11:-4.5119 12:-5.28309 13:-4.35789 14:-4.76992 15:-4.16866 16:-4.6897 17:-3.76224 18:-4.13129 19:-4.4489 20:-4.32605 000e0e58a4cb4a218bbc6cae0b1af201-none

Как мне прочитать это в R?

Вот мой код:

## load raw vw (CS)OAA scores
read.vw.oaa.scores <- function (myfile) {
  v <- sapply(strsplit(readLines(myfile),' ',fixed=TRUE), function (r) {
    m <- matrix(unlist(strsplit(head(r,-1),':',fixed=TRUE)),ncol=2,byrow=TRUE)
    stopifnot(identical(1:nrow(m),as.integer(m[,1])))
    c(tail(r,1),m[,2])
  })
  f <- as.data.frame(t(v),stringsAsFactors=FALSE)
  names(f) <- c("id",head(names(f),-1))
  for (n in tail(names(f),-1))
    f[[n]] <- as.numeric(f[[n]])
  f
}

Есть ли очевидные ошибки/неэффективность? Есть ли способ лучше?

PS. Этот формат данных выглядит как CRS, но это не так.


person sds    schedule 28.07.2014    source источник


Ответы (1)


Посмотрите, работает ли для вас следующее (возможно, очень медленно). Предполагается, что все требуемые значения представлены в числовом формате:значение. И использует raw, который требует, чтобы каждая строка сохранялась в виде массива символов.

raw = c("1:-2.31425 2:-3.98557 3:-3.97967 4:-2.63708 5:-3.18749 6:-2.43984 7:-4.99018 8:-3.49138 9:-3.07816 10:-6.15126 11:-6.01152 12:-5.76039 13:-5.13096 14:-5.18472 15:-5.37358 16:-5.24147 17:-5.21512 18:-5.67961 19:-4.62929 20:-4.61404 000db8cd6aef4e5fa459126d36e0fa1f-none",
"1:-2.65864 2:-3.33924 3:-2.8116 4:-1.83108 5:-2.05677 6:-1.29879 7:-6.7446 8:-3.05036 9:-2.82138 10:-5.19605 11:-4.5119 12:-5.28309 13:-4.35789 14:-4.76992 15:-4.16866 16:-4.6897 17:-3.76224 18:-4.13129 19:-4.4489 20:-4.32605 000e0e58a4cb4a218bbc6cae0b1af201-none")

Функция очистки

clean = function(t, n) {as.numeric(gsub("^[0-9]+:", "", unlist(strsplit(t, split=" "))[1:n]))}
lapply(raw, clean, n = 20)

[[1]]
 [1] -2.31425 -3.98557 -3.97967 -2.63708 -3.18749 -2.43984 -4.99018 -3.49138 -3.07816 -6.15126 -6.01152 -5.76039
[13] -5.13096 -5.18472 -5.37358 -5.24147 -5.21512 -5.67961 -4.62929 -4.61404

[[2]]
 [1] -2.65864 -3.33924 -2.81160 -1.83108 -2.05677 -1.29879 -6.74460 -3.05036 -2.82138 -5.19605 -4.51190 -5.28309
[13] -4.35789 -4.76992 -4.16866 -4.68970 -3.76224 -4.13129 -4.44890 -4.32605
person Vlo    schedule 28.07.2014
comment
Спасибо. Обратите внимание, что, во-первых, возвращаемое вами значение не является data.frame. Во-вторых, вы теряете идентификаторы. В-третьих, вы не выполняете проверку ошибок (см. stopifnot в моем коде). - person sds; 28.07.2014