Разница между уникальным и уникальным в сохранении - PullRequest
0 голосов
/ 06 мая 2018

Решение:

dfrm1[ dfrm1$Name %in% dfrm2$Name , ]

Я на самом деле пробовал это раньше самостоятельно, но, похоже, это не сработало, так как я всегда проверял

unique(dfrm1$name) 

, и это вернуло мне этоУ меня все еще есть тысяча разных фирм вместо ожидаемых 500. Но теперь я использовал

dfrm1[ dfrm1$Name %in% dfrm2$Name , ] 

без отрицания, так как я хотел сохранить все строки в dfrm1 $ Name, которые содержат dfrm2 $ Name.Затем я сделал следующее.Я сохранил свой уникальный код (имя dfrm1 $) в новом объекте x, выполнив

x <- unique(dfrm1$Name)

Когда я сделаю

View(x) 

, я получу правильные 500 уникальных значений, хотя просто

unique(dfrm1$Name)

показывает мне Factor w/ 1000 levels "...." в правом верхнем углу RStudio.

Кто-нибудь знает ответ, почему только View(x) показывает правильные значения?

1 Ответ

0 голосов
/ 07 мая 2018

Вы имеете дело с категориальной переменной, также известной как фактор.

Символьные столбцы считываются в множитель, если вы используете data.frame, as.data.frame, read.table ... без явной установки stringsAsFactors=FALSE. Это может объяснить, почему вам приходится иметь дело с этим типом данных, когда кажется, что вы не хотите.

Элементы вектора factor могут принимать ограниченное количество значений, заданных его атрибутом levels. Эти уровни отображаются при печати unique(dfrm1$name) вместе со значениями.

Когда вы удаляете элементы из вектора factor, по умолчанию сохраняются все уровни, включая те, которые больше не описывают какой-либо элемент вектора.

См. Также ?droplevels

Чтобы преобразовать factor в character, используйте as.character.

См. Пример ниже:

x <- factor(c("a","b"),levels = c("a","b","c"))
x # same output for unique(x)
# [1] a b
# Levels: a b c

levels(x)
# [1] "a" "b" "c"

length(x)
# [1] 2

length(levels(x))
# [1] 3

as.character(x)
# [1] "a" "b"

levels(as.character(x))
# NULL
...