Различное поведение пересечения на векторах и факторах - PullRequest
1 голос
/ 25 января 2012

Я пытаюсь сравнить несколько векторов Entrez ID (целочисленных векторов), используя Reduce (intersect, ...).Векторы выбираются из базы данных с использованием «DISTINCT», поэтому один вектор не содержит дубликатов.

length(factor(c(l1$entrez)))

дает ту же длину (и те же идентификаторы без функции длины), что и

length(c(l1$entrez))

Когда я сравниваю несколько векторов с

length(Reduce(intersect,list(c(l1$entrez),c(l2$entrez),c(l3$entrez),c(l4$entrez))))

или

length(Reduce(intersect,list(c(factor(l1$entrez)),c(factor(l2$entrez)),c(factor(l3$entrez)),c(factor(l4$entrez)))))

результат не тот же.Я знаю этот фактор! = OriginalVector, но я не могу понять, почему результат отличается, хотя длина и уровни исходных факторов / векторов одинаковы.

Может кто-нибудь объяснить, почему функция векторов пересечения работает с векторами?а факторы?Неужели пересечение двух списков факторов снова является списками факторов, а затем дубликаты рассматриваются по-разному?

Редактировать - Пример:

> head(l1)
  entrez
1      1
2 503538
3  29974
4  87769
5      2
6 144568

> head(l2)
 entrez
1  1743
2  1188
3  8915
4  7412
5 51082
6  5538

Списки содержат от 500 до 20K идентификаторов Entrez.Таким образом, векторы содержат чистое целое число и должны давать пересечение среди всех проверенных векторов.

> length(Reduce(intersect,list(c(factor(l1$entrez)),c(factor(l2$entrez)),c(factor(l3$entrez)),c(factor(l4$entrez)))))
[1] 514
> length(Reduce(intersect,list(c(l1$entrez),c(l2$entrez),c(l3$entrez),c(l4$entrez))))
[1] 338
> length(Reduce(intersect,list(l1$entrez,l2$entrez,l3$entrez,l4$entrez)))
[1] 494

Я должен извиниться.Различное поведение функции пересечения может быть вызвано проблемой с данными.Я нашел поля в наборе данных, содержащих разделенные запятыми идентификаторы Entrez (22038, 23207, ...).Я должен был более детально взглянуть на данные в первую очередь.Спасибо за ответы и ваше время.Хотя я пока не понимаю разные результаты, я уверен, что это является причиной различного поведения.Кто-нибудь может это подтвердить?

1 Ответ

0 голосов
/ 25 января 2012

Как говорит Роман, пример был бы очень полезен.

Тем не менее, одна возможность состоит в том, что ваши переменные l1$entrez, l2$entrez и т. Д. Имеют одинаковые уровни, но в разных порядках.

intersect преобразует свои аргументы через as.vector, который превращает факторы в символьные переменные.Обычно это правильно, так как это означает, что изменяющийся порядок уровней не имеет никакого значения для результата.

Передача factor(l1$entrez) в качестве аргумента intersect также устраняет влияние переменного уровняпорядок, поскольку он эффективно создает новый фактор с уровнем порядка, установленным по умолчанию.Однако, если вы передадите c(l1$entrez), вы удалите атрибуты фактора из своей переменной, и у вас останутся необработанные целочисленные коды, которые будут зависеть от упорядочения уровней.

Пример:

a <- factor(letters[1:3], levels=letters)
b <- factor(letters[1:3], levels=rev(letters)

# returns 1 2 3
intersect(c(factor(a)), c(factor(b)))

# returns integer(0)
intersect(c(a), c(b))

Я не вижу причин, по которым вы должны использовать c() здесь.Просто позвольте R обрабатывать факторы самостоятельно (хотя, чтобы быть справедливым, есть другие сценарии, в которые вы хотите вмешаться).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...