при использовании `cbind ()`, «идентичные» входы запускают различные варианты поведения: имена строк были найдены из короткой переменной и были отброшены - PullRequest
1 голос
/ 09 февраля 2020

Следующая операция работает нормально:

df1 <- data.frame(a= 1, b = 2) 
cbind(df1, c=3:4)
#>   a b c
#> 1 1 2 3
#> 2 1 2 4

Однако, если я задаю подмножество df1, даже сохраняя его идентичным, я получаю предупреждение:

df2 <- df1[1,]
identical(df1, df2)
#> [1] TRUE
cbind(df2, c=3:4)
#>   a b c
#> 1 1 2 3
#> 2 1 2 4

Предупреждение в data.frame (..., check.names = FALSE): имена строк были найдены из короткой переменной и были отброшены

Я не установил никаких имен строк, и они должны быть идентичным, что происходит?

1 Ответ

2 голосов
/ 09 февраля 2020

identical() не всегда рассказывает полную историю по умолчанию:

identical(df1, df2, attrib.as.set = FALSE)
#> [1] FALSE

Эта опция сравнивает атрибуты более строго, хотя здесь, если мы посмотрим на них, мы увидим только разницу в порядке , что не является причиной наблюдаемого поведения, как мы увидим.

attributes(df1)
#> $names
#> [1] "a" "b"
#> 
#> $class
#> [1] "data.frame"
#> 
#> $row.names
#> [1] 1
attributes(df2)
#> $names
#> [1] "a" "b"
#> 
#> $row.names
#> [1] 1
#> 
#> $class
#> [1] "data.frame"

Мы можем попытаться использовать row.names(), но это не поможет, однако дополнительная информация может быть отображена с помощью .row_names_info() и dput():

row.names(df1) # sneaky snake!
#> [1] "1"
row.names(df2)
#> [1] "1"
.row_names_info(df1)
#> [1] -1
.row_names_info(df2)
#> [1] 1

dput(df1)
#> structure(list(a = 1, b = 2), class = "data.frame", row.names = c(NA, 
#> -1L))
dput(df2)
#> structure(list(a = 1, b = 2), row.names = 1L, class = "data.frame")

На самом деле, cbind.data.frame() вызывает data.frame(), который сам вызывает .row_names_info() и проверяет его знак, прежде чем вызвать предупреждение, а .row_names_info(df1) отрицательный, в то время как .row_names_info(df2) положительны.

Установка имен строк в NULL "повторная инициализация" row.names.

row.names(df2) <- NULL
cbind(df2, c=3:4)
#>   a b c
#> 1 1 2 3
#> 2 1 2 4

Итак, по сути, предупреждение говорит о том, что мы пытались перезаписать строки в data.frame, у которого были имена строк, поэтому имена повторений должны были игнорироваться. Если имена строк действительно отсутствуют, переработка происходит молча.

Теперь мы можем поспорить об определении и значимости того, что здесь «без имен строк».

Я знаю, что это ответ не отвечает на все (не на все как и не на что), но это все, что у меня есть!

...