as.character () при применении к отдельному элементу data.frame по сравнению со всей «строкой» data.frame - PullRequest
0 голосов
/ 21 марта 2020

У меня есть data.frame, как это:

df<-data.frame(x=c(1,2,3),y=c('b','a','c'))

Если я ввожу команды:

as.character(df$y[1]) или as.character(df[1,2])

Я получаю вывод "b"

Если я введу команду:

as.character(df[1,])

Я получу вывод "1" "2"

Я понимаю, что для последней команды, перечисленной выше , R дает мне уровень фактора символа 'b'

Однако, почему он не делает этого для первых двух команд?

Что на самом деле делает R "внутренне", когда я ввожу as.character()? Что бы это ни было, я полагаю, что это причина для другого выхода.

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 21 марта 2020

Может быть, вы можете попробовать

> c(as.matrix(df[1,]))
[1] "1" "b"

или

> mapply(as.character,df[1,])
  x   y 
"1" "b" 
0 голосов
/ 21 марта 2020

Я постараюсь показать вам шаг за шагом, что у меня сложилось впечатление о том, что происходит внутри 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 приводит все элементы в один вектор, а затем преобразует его в символ. Надеюсь, это поможет

0 голосов
/ 21 марта 2020

Я не уверен насчет внутренних функций as.character (). Но, возможно, это решит проблему: df<-data.frame(x=c(1,2,3), y=c('b','a','c'), stringsAsFactors = FALSE) Тогда as.character(df[1,]) вернет [1] "1" "b". Это [1] "1" "b", а не "b", потому что df [1,] возвращает всю строку.

Надеюсь, это поможет. С наилучшими пожеланиями

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