Есть ли эффективный способ получить data.table для имитации ldply из plyr, когда объединяются пустые части? - PullRequest
2 голосов
/ 08 сентября 2011

Предположим, у меня есть список файлов, которые я хочу объединить в одну таблицу data.table.Мой основной способ решения этой проблемы - сделать что-то вроде этого:

files <- dir(...) # The list of files to be combined

read.data <- function(loadfile) {
    data.dt <- data.table(read.csv(loadfile));
}

data.dt <- data.table(file = files)[, read.data(file), by = file]

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

Error in `[.data.table`(data.table(file = files), , read.data(file),  :
columns of j don't evaluate to consistent types for each group

Есть ли способ получить data.table для правильного объединения пустых или пустых значений?Таким образом, вы могли бы просто сделать что-то вроде

if(dim(data.dt)[1] == 0) {
    data.dt <- NULL
}

И это должно исправить большинство проблем, с которыми я сталкиваюсь.

РЕДАКТИРОВАТЬ: Я должен отметить, что у меня естьуже реализовал эту логику, используя подпрограммы plyr.ldply () работал безупречно, но, к сожалению, очень медленно и занимал много памяти, когда вы пытаетесь передать больше, чем небольшое количество файлов.

1 Ответ

2 голосов
/ 09 сентября 2011

Это новая ошибка в data.table.Я поднял здесь , чтобы он не был забыт.

Более простой пример:

DT = data.table(a=1:3,b=1:9)
DT
      a b
[1,] 1 1
[2,] 2 2
[3,] 3 3
[4,] 1 4
[5,] 2 5
[6,] 3 6
[7,] 1 7
[8,] 2 8
[9,] 3 9
DT[,if (a==2) NULL else sum(b),by=a]
Error in `[.data.table`(DT, , if (a == 2) NULL else sum(b), by = a) : 
  columns of j don't evaluate to consistent types for each group

Следующая ошибка верна:

DT[,if (a==2) 42 else sum(b),by=a]
Error in `[.data.table`(DT, , if (a == 2) 42 else sum(b), by = a) : 
  columns of j don't evaluate to consistent types for each group

и исправлено с помощью:

DT[,if (a==2) 42L else sum(b),by=a]
     a V1
[1,] 1 12
[2,] 2 42
[3,] 3 18

, но я не могу придумать обходного пути для NULL, пока ошибка не будет устранена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...