Разбить элементы в векторе на разные столбцы с фредом - PullRequest
0 голосов
/ 03 декабря 2018

Предположим, у меня очень большой файл TSV с более чем 20M строками, которые выглядят так:

    a b {"condition1":["ABC"], "condition3":false, "condition4":4000}
    c c {"condition1":["BBB"],"condition2":true}

Мне нужно, чтобы он выглядел следующим образом:

     Var1 Var2 Condition1 Condition2 Condition3 Condition4
     a    b    ABC        NA         FALSE      4000
     c    c    BBB        TRUE       NA         NA

Я попробовал следующий код,но это:неэффективно б.не работает

в любом случае готовое решение для разделения 3-го столбца при чтении?

     dt<-fread(input = ifilename, header = T,encoding = "UTF-8" )
     output<-dt[,c("filter")]  #assume the third column named "filter"
     fwrite(x = output,file = "./DB/filter.csv",)
     filter.db<-fread(input ="./DB/filter.csv",fill=T)

Ответы [ 2 ]

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

* nix-инструменты могут быть быстрее в этом случае, так как анализаторы json в R немного медленны в моем тестировании.

> library(data.table)
> aTbl = fread(cmd="cat foo.txt | grep -P -o '^\\w+\\s+\\w+'", header=F)
> aTbl
   V1 V2
1:  a  b
2:  c  c

> bTbl = fread(cmd="cat foo.txt | grep -P -o '[{].*$' | jq -r '[ .condition1[], .condition2, .condition3, .condition4 ] | @csv'", header=F)
> bTbl
    V1   V2    V3   V4
1: ABC   NA FALSE 4000
2: BBB TRUE    NA   NA

> setnames(aTbl, c('Var1', 'Var2'))
> setnames(bTbl, c('Condition1', 'Condition2', 'Condition3', 'Condition4'))

> cTbl = cbind(aTbl, bTbl)
> cTbl
   Var1 Var2 Condition1 Condition2 Condition3 Condition4
1:    a    b        ABC         NA      FALSE       4000
2:    c    c        BBB       TRUE         NA         NA
>
0 голосов
/ 03 декабря 2018

Возможное решение:

library(data.table)
library(jsonlite)

to_add <- rbindlist(lapply(dt$V3, function(x) setDT(fromJSON(x))), fill = TRUE)
setcolorder(to_add, sort(names(to_add)))

dt[, names(to_add) := to_add][, V3 := NULL][]

, что дает:

   V1 V2 condition1 condition2 condition3 condition4
1:  a  b        ABC         NA      FALSE       4000
2:  c  c        BBB       TRUE         NA         NA

Используемые данные:

dt <- structure(list(V1 = c("a", "c"),
                     V2 = c("b", "c"),
                     V3 = c("{\"condition1\":[\"ABC\"], \"condition3\":false, \"condition4\":4000}",
                            "{\"condition1\":[\"BBB\"],\"condition2\":true}")),
                .Names = c("V1", "V2", "V3"), row.names = c(NA, -2L), class = c("data.table", "data.frame"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...