У меня очень большая таблица данных с размером 1,6x10 ^ 8 строк, и я хочу выполнить построчную операцию между столбцами exposure
и exposure.before.index
, как показано в моем примере ниже.
Я создал столбец TI (т. Е. «Интенсивность лечения»), который показывает, является ли в настоящее время не идентификатором наркотик / наркотики, exposure
, который отличается от любых лекарств, которые он принимал у каждого идентификатора. соответствующий первый ряд, exposure.before.index
. Вы можете просмотреть мой код и заметить, что окончательный результат соответствует описанному.
library(data.table)
DT <- data.table::data.table(ID=c("a","a","a","b","b","c","c"),
drugA=c(1,1,1,0,0,0,0),
drugB=c(0,1,1,1,0,0,0),
drugC=c(0,0,1,0,1,0,0))
DT[, exposure := gsub("NA\\+|\\+NA", "", do.call(paste,
c(Map(function(x, y) names(.SD)[(NA^!x) * y], .SD,
seq_along(.SD)), sep="+"))), .SDcols = drugA:drugC]
DT[exposure=="NA",exposure:="NONE"]
DT[,exposure.before.index:=c("drugA","drugA","drugA","drugB","drugB","NONE","NONE")]
DT[,CNT:=1:.N]
DT[!(exposure.before.index!="NONE" & exposure=="NONE"),TI:=(any(!unlist(strsplit(exposure, "[+]"))%in%unlist(strsplit(exposure.before.index, "[+]")))),by="CNT"]
DT[is.na(TI),TI:=FALSE]
DT
ID drugA drugB drugC exposure exposure.before.index CNT TI
1: a 1 0 0 drugA drugA 1 FALSE
2: a 1 1 0 drugA+drugB drugA 2 TRUE
3: a 1 1 1 drugA+drugB+drugC drugA 3 TRUE
4: b 0 1 0 drugB drugB 4 FALSE
5: b 0 0 1 drugC drugB 5 TRUE
6: c 0 0 0 NONE NONE 6 FALSE
7: c 0 0 0 NONE NONE 7 FALSE
Я создал CNT, чтобы применить свою функцию any(!unlist(strsplit(exposure, "[+]"))%in%unlist(strsplit(exposure.before.index, "[+]")))
между exposure
и exposure.before.index
. Из-за 1.6x10 ^ 8 строк, которые у меня есть, этот метод занимает довольно много времени. Я обычно использую этот метод data.table [..., by = "CNT"], когда хочу применить определенную операцию / функцию по строкам, но я нахожу это не надежным для очень больших таблиц data.table. Существуют ли другие методы, которые есть у некоторых из вас, более надежные, чем мой метод?
Я нашел другие вопросы, похожие на мои топи c, но ответы не были обобщены для применения строки. разумная операция над пользовательской функцией надежным способом.
Любая помощь и / или советы приветствуются.