Ошибка при попытке задать подкадр данных на основе значений в столбце другого кадра данных - PullRequest
1 голос
/ 12 января 2020

У меня есть датафрейм с 4199 значениями. Это выглядит так:

df1$factor <– c("fgsgh:fshg:f92-w", "fqweir:pqfy:2009-fg(877)", "gdhgka:2794:f8v")

Этот столбец значений соответствует ровно 4199 ячейкам в столбце в кадре данных с 71 столбцом и около 150 000 строк:

df2$alt_factor <– c("fgsgh:fshg:f92-w", "fqweir:pqfy:2009-fg(877)", "gdhgka:2794:f8v", "xrxw75:7d5c:e(s)djg7")

Я пытаюсь поместить все столбцы в df2 так, чтобы я получил все значения в 72 столбцах, но только 4199 строк, которые соответствуют df1$factor, используя этот код:

test <- df2[trimws(df1$factor) %in% trimws(df2$alt_factor), ]

Однако каждый раз, когда я получаю один и тот же код ошибки:

Error in [.data.table... : i evaluates to a logical vector length 4199 but there are 144415 rows. Recycling of logical i is no longer allowed as it hides more bugs than is worth the rare convenience. Explicitly use rep(...,length=.N) if you really need to recycle.

Есть идеи, как решить эту проблему? Заранее спасибо за помощь!

1 Ответ

1 голос
/ 12 января 2020

Сравнение должно быть обратным, потому что логический %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')))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...