преобразовать data.table (или data.frame) в yaml, а затем обратно в исходный формат - PullRequest
0 голосов
/ 21 декабря 2018

Я хотел бы преобразовать data.table (также data.frame) в формат yaml, а затем преобразовать этот yaml обратно в исходный формат, но больше нет доступа к исходному data.frame.Попытка data.table(), as.data.table() (и их эквиваленты в data.frame) не удалась.

MWE:

library(data.table)
library(yaml)

foo <- rbindlist(list(
data.table(env = "default", a = "low", x = "A", z = "low", i =  1, j = 1, k = 1),
data.table(env = "default", a = "low", x = "A", z = "medium", i =  1, j = 2, k = 1),
data.table(env = "default", a = c("low", "medium", "high"), x = "A", z = "high", i =  2, j = 1, k = 1),
data.table(env = "other", a = c("low", "medium", "high"), x = "B", z = "na", i =  2, j = 2, k = 2)
))
out <- split(replace(foo, "env", NULL), foo$env)
out <- as.yaml(out)
# cat(out)

# foo is no longer available
# rm(foo)

bar <- yaml::yaml.load(out, as.named.list = T)

# how to make bar same as foo, i.e. as follows:
#        env      a x      z i j k
# 1: default    low A    low 1 1 1
# 2: default    low A medium 1 2 1
# 3: default    low A   high 2 1 1
# 4: default medium A   high 2 1 1
# 5: default   high A   high 2 1 1
# 6:   other    low B     na 2 2 2
# 7:   other medium B     na 2 2 2
# 8:   other   high B     na 2 2 2

1 Ответ

0 голосов
/ 21 декабря 2018

Проблема в том, что as.yaml уничтожает атрибуты, что отличает data.frame от списка в R:

library(data.table)
library(yaml)

foo <- rbindlist(list(
  data.table(env = "default", a = "low", x = "A", z = "low", i =  1, j = 1, k = 1),
  data.table(env = "default", a = "low", x = "A", z = "medium", i =  1, j = 2, k = 1),
  data.table(env = "default", a = c("low", "medium", "high"), x = "A", z = "high", i =  2, j = 1, k = 1),
  data.table(env = "other", a = c("low", "medium", "high"), x = "B", z = "na", i =  2, j = 2, k = 2)
))

Так должны выглядеть атрибуты.

> attributes(foo)
$`names`
[1] "env" "a"   "x"   "z"   "i"   "j"   "k"  

$row.names
[1] 1 2 3 4 5 6 7 8

$class
[1] "data.table" "data.frame"

$.internal.selfref
<pointer: 0x0000000002521ef0>

И вот как они выглядят.

foo2 <- as.yaml(foo)
# cat(out)
bar <- yaml::yaml.load(foo2)

> attributes(bar)
$`names`
[1] "env" "a"   "x"   "z"   "i"   "j"   "k"  

Таким образом, преобразование в data.frame так же просто, как:

attributes(bar)$class <- "data.frame"
attributes(bar)$row.names <- seq_along(bar[, 2])

Или в данные.стол:

attributes(bar)$class <- "data.frame"
bar <- as.data.table(bar)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...