Я хотел бы знать, сколько раз каждая переменная изменяется внутри каждой группы, а затем добавляет результат для всех групп.данные.table. Быстрый способ подсчета количества изменений в каждом столбце
Я нашел способ:
mi[,lapply(.SD, function(x) sum(x != shift(x),
na.rm=T)), by = ID][,-1][,lapply(.SD,sum, na.rm=T)]
Он работает, она производит правильный результат, но это очень медленно в моей большой DataTable. Я хотел бы сделать обе операции внутри одного и того же lapply (или чего-то более быстрого и компактного), но первый из них выполняется группой, второй - нет.
Это может быть написано в более простом способе (возможно не всегда)
mi[,lapply(.SD, function(x) sum(x != shift(x),
na.rm=T))] [,-1]-mi[,length(unique(ID))]+1
Но это по-прежнему медленно и требует много памяти.
Любая другая идея?
Я также попытался использовать diff вместо смены, но это становится сложнее.
Здесь у вас есть фиктивный пример:
mi <- data.table(ID=rep(1:3,each=4) , year=rep(1:4, times=3),
VREP=rep(1:3,each=4) , VDI=rep(1:4, times=3), RAN=sample(12))
mi <- rbind(mi, data.table(4,1,1,1,0), use.names=F)
Большой пример для теста
mi <- as.data.table(matrix(sample(0:100,10000000,
replace=T), nrow=100000, ncol=100))
mi[,ID := rep(1:1000,each=100)]
Моя проблема заключается в том, что истинный набор данных гораздо больше, это в пределе объема памяти, то я «Я настроил R, чтобы иметь возможность использовать больше памяти с помощью файла подкачки, и это замедляет работу. Я знаю, что я мог бы сделать это, разделив файл и присоединившись к нему снова, но иногда это усложняет работу или некоторые операции не являются разборчивыми.
Если я что-то не хватает, заказав на «ID», вы могли бы посчитать, сколько раз изменения в значениях идет вместе с изменением id; 'id = mi $ ID [-1] == mi $ ID [-nrow (mi)]; sapply (mi, function (x) sum ((x [-1]! = x [-length (x)]) & id)) ' –
Мне жаль, что ваш метод в два раза медленнее моего первого метода и в четыре раза медленнее второго. – skan
Бенчмарк и достаточно большой пример (написанный как функция 'n'), необходимый ... – Frank