Как ускорить процесс транспонирования набора данных - PullRequest
0 голосов
/ 09 июля 2020

Для моей диссертации я использую очень большой дамп sql. Пока что удалось открыть небольшие сегменты дампа sql в R. Однако все данные структурированы следующим образом:

X Икс Икс Икс

Х Y Y Y

Х Z Z Z

Если я хочу интерпретировать данные более эффективно, данные должны выглядеть так:

XXXX XYYY XZZZ

Чтобы выполнить sh это, я написал for l oop, который переносит данные. К сожалению, из-за размера набора данных (и моей памяти) этот l oop очень медленный. Есть у кого-нибудь идеи как ускорить for l oop или вообще ускорить процесс? Я пытался использовать dcast/reshape, но похоже, что эти функции не помогут.

Сейчас мой код выглядит так:

DATAclean <- data.table()
for (i in c(1:100)){
  vector <- DATAtransed[,..i]
  vector <- na.omit(vector)
  StartCol <- seq(from = 1, to = (nrow(vector)), by = 4)
  Sys.sleep(0.001)
  print(i)
  flush.console()
  for (j in StartCol){
    new_data <- vector[c(j:(j+3))]
    new_data <- t(new_data)
    DATAclean <- rbind(DATAclean, new_data)
  }
}

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Иногда может быть более эффективным (особенно в отношении памяти) работать с большими файлами построчно, например, используя обычные подозреваемые в командной строке unix / linux или perl, python. ..

Предполагая, что ваши данные содержат один столбец, как в вашем примере, и вы хотите объединить каждые 4 строки без разделителя, удалив пустые строки, вы могли бы сделать:

awk 'NF' infile | paste -d ''  - - - - > outfile

Очевидно, вы также можете обернуть это в вызове system в R, чтобы получить весь результат в R:

system("awk 'NF' filename | paste -d ''  - - - - ", intern=TRUE)
0 голосов
/ 09 июля 2020

Возможно, вы можете попробовать базовую опцию R ниже

do.call(
    rbind,
    lapply(
        unname(split(seq_along(data), ceiling(seq_along(data) / 4))),
        function(k) data[k]
    )
)

, которая дает

     [,1] [,2] [,3] [,4]
[1,] "X"  "X"  "X"  "X"
[2,] "X"  "Y"  "Y"  "Y"
[3,] "X"  "Z"  "Z"  "Z"

DATA

data <- structure(c("X", "X", "X", "X", "X", "Y", "Y", "Y", "X", "Z", 
"Z", "Z"), .Dim = c(12L, 1L))
...