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
, у которого были имена строк, поэтому имена повторений должны были игнорироваться. Если имена строк действительно отсутствуют, переработка происходит молча.
Теперь мы можем поспорить об определении и значимости того, что здесь «без имен строк».
Я знаю, что это ответ не отвечает на все (не на все как и не на что), но это все, что у меня есть!