Вот частая проблема, с которой я столкнулся недавно в R с data.table
Переиндексирование в R с помощью data.table?
У меня есть таблица индексов, скажем DT1. Столбец x будет подмножеством индексов. Я бы работал с подтаблицей более крупного сырья, используя эти индексы. подтаблица обычно индексируется от 1 до N. (то есть столбец y)
тогда, например, я бы столкнулся с таблицей с парами индексов с исходной индексацией, и я хочу знать соответствующую новую индексацию.
Вот как это выглядит
DT1 <- data.table(x=c(0,3,5),y= c(11,22,33))
DT2 <- data.table(x=c(3,3,0,0,5),x=c(0,5,0,3,5))
# > DT1
# x y
# 1: 0 11
# 2: 3 22
# 3: 5 33
# > DT2
# x x
# 1: 3 0
# 2: 3 5
# 3: 0 0
# 4: 0 3
# 5: 5 5
Вот извилистый путь я нашел
cbind(DT1[DT2[,1,with=FALSE],on="x"][,2,with=FALSE],DT1[DT2[,2,with=FALSE],on="x"][,2,with=FALSE])
# y y
# 1: 22 11
# 2: 22 33
# 3: 11 11
# 4: 11 22
# 5: 33 33
более основной способ сделать это с sapply
дает тот же результат
tab=DT1$x
lookup <- function(value){DT1$y[which(tab==value)]}
colnames(DT2) <- c("x","xx")
ans <- as.data.table(cbind(sapply(DT2$x,lookup),sapply(DT2$xx,lookup)))
colnames(ans) <- c("y","y")
Однако первое решение выглядит немного уродливо для меня
Мне не нравится второй, потому что мне нужно определить назначение значения для вкладок каждый раз, когда я использую поиск функции в lapply
. Если бы мне пришлось искать в разных таблицах, у меня был бы выбор либо создать новую функцию поиска, специфичную для этой таблицы, либо сохранить в памяти вкладку переменных (temp). возможно есть способ сделать lapply
с функцией двух переменных lookup <-function (tab,value) {...}
? что я не знаю
Я уверен, что существует много других способов. Я не уверен, что я делаю именно с первым решением. в основном синтаксис в data.table
связан с (внутренним и внешним) JOINS. но в конечном выпуске я хочу сохранить исходный порядок таблицы DT2. установив столбец x в качестве ключа для DT2, будет сортировать этот столбец, создавая такие вещи, как merge
, которые не адаптированы к этому?
Я желаю услышать от вас, что является лучшей реализацией, - я уверен, что есть много лучших, - а также, что наиболее эффективно при работе с очень большими таблицами.
'DT2 [, lapply (.SD, function (x) factor (x, levels = DT1 $ x, labels = DT1 $ y))]'? – A5C1D2H2I1M1N2O1R2T1
отлично, спасибо! что означает .SD? –
@AnandaMahto - очень аккуратный код, хотя это использует синтаксис 'data.frame' в частях. Но я не уверен в этом. – thelatemail