Я постараюсь показать вам шаг за шагом, что у меня сложилось впечатление о том, что происходит внутри R:
data.frames фактически являются списками:
typeof(df)
# list
# drops the data.frame class essentially
?`[`
class(df[1, , drop = TRUE])
class(df[1, , drop = FALSE])
Поскольку data.frames фактически являются списками строка фрейма данных - это список, содержащий столько элементов, сколько столбцов в data.frame:
df[1, , drop = TRUE]
Unlist the list
Когда вы пытаетесь привести список к вектор, вы unlist()
это. «Unlist ()» сам приводит элементы к определенной иерархии, если не все элементы имеют одинаковый тип. Как указано в разделе Значение на странице справки unlist:
Тип вывода определяется по наивысшему типу компонентов в иерархии NULL
Какой у меня тип?
В этом случае необходимо привести двойные и целочисленные значения к самый высокий тип, то есть двойной. Это потому, что факторы на самом деле хранятся в виде целых чисел. Посмотрите код ниже, что происходит, в каком случае и с какими типами мы имеем дело:
df <- data.frame(x = c(1, 2, 3),
y = c('b','a','c'))
class(df$x)
typeof(df$x)
class(df$y)
typeof(df$y)
unlist(df[1, , drop = TRUE])
typeof(unlist(df[1, , drop = TRUE]))
df <- data.frame(x = 1:3, # this returns integers
y = c('b','a','c'))
class(df$x)
typeof(df$x)
class(df$y)
typeof(df$y)
unlist(df[1, , drop = TRUE])
typeof(unlist(df[1, , drop = TRUE]))
Как видите, R приводит все элементы в один вектор, а затем преобразует его в символ. Надеюсь, это поможет