Сравнение должно быть обратным, потому что логический %in%
оценивает в lhs и дает длину, основанную на том, что исходные данные не имеют столько строк или могут быть больше этого.
library(data.table)
df2[trimws(alt_factor) %chin% trimws(df1$factor)]
# alt_factor
#1: a
#2: b
#3: c
#4: a
Ошибка OP воспроизводима на простом примере
df2[trimws(df1$factor) %in% trimws(df2$alt_factor), ]
Ошибка в [.data.table
(df2, trimws (df1 $ factor)% в% trimws (df2 $ alt_factor),: i оценивается как длина логического вектора 4, но имеется 6 строк. Переработка логического i больше не разрешена, поскольку она скрывает больше ошибок, чем стоит редкое удобство. Явно используйте rep (..., length = .N) если вам действительно нужно перезапустить.
Теперь давайте проверим, что происходит
df2[, trimws(df1$factor) %in% trimws(df2$alt_factor)]
#[1] TRUE TRUE TRUE TRUE
Возвращает логический вектор длины 4 и количество строк в «df2» равно 6, что создает дисбаланс для индексации строк набора данных. Вместо этого, если мы сделаем обратное
df2[, trimws(alt_factor) %chin% trimws(df1$factor)]
#[1] TRUE TRUE TRUE FALSE FALSE TRUE
, логический вектор будет той же длины, что и число строк в «df2»
данные
df1 <- data.table(factor = factor(c(' a', 'b', 'a', 'c ')))
df2 <- data.table(alt_factor = factor(c(' a', 'b', 'c', 'd ', 'e', 'a')))