2015-07-11 2 views
1

Я по-прежнему немного новичок в программировании R. Я смущен, почему подмножество кадра данных возвращает коэффициент, а не только вектор с одним элементом. Почему это R по умолчанию? Это потому, что я подмножество - это слово, а не значение? Тем не менее, я бы ожидал символьный вектор.Почему фактор возвращается, когда я подмножаю DataFrame?

Например:

n <- c(2,3,5) 
s = c("aa", "bb","cc") 
b <- c(TRUE, FALSE, TRUE) 
df <- data.frame(n,s,b) 
df 

test <- df[1,"s"] 
test 
class(test) #this says it's a factor 

Спасибо!

ответ

0

На самом деле, я думаю, что нашел ответ, который я искал, что действительно Почему подмножества символов в кадрах данных R хранятся в качестве факторов, а не как отдельные элементы вектора. Значение, цель за ним, а не только тот факт, что он делает, что можно легко увидеть только в ?data.frame().

После выполнения некоторых исследований выясняется, что целью этого является создание защиты от применения номинальных (категориальных, неординарных) данных неправильного пути в статистическом анализе (например, это не имеет смысла иметь более номинального ценностно меняющегося цвета не более чего-то, только номинально отличается

Этот сайт действительно помог очистить его для меня:.! http://www.stat.berkeley.edu/~s133/factors.html

Спасибо за ответы

4

Функция data.frame() по умолчанию превращает символьные векторы в факторы. Если вы не хотите этого поведения, используйте data.frame(..., stringsAsFactors=FALSE).

Также обратите внимание, что R не имеет «одиночных значений», он имеет только векторы. Даже номер 1 представляет собой только один вектор длины.

+0

ye s, вот почему я написал: «... в отличие от всего лишь вектора с одним элементом» –

2

См. ?data.frame. Одним из значений по умолчанию data.frame() является преобразование векторов символов, таких как ваши s = c("aa", "bb","cc") в факторы. Чтобы изменить это, вам необходимо изменить аргумент stringsAsFactors по умолчанию: TRUE - FALSE.

Вот как вы можете изменить код:

n <- c(2,3,5) 
s = c("aa", "bb","cc") 
b <- c(TRUE, FALSE, TRUE) 
df <- data.frame(n,s,b, stringsAsFactors = FALSE) 
df 

test <- df[1,"s"] 
test 
class(test) #Now returns character. 
1

На самом деле test не является вектором, хотя есть один элемент. Он имеет атрибуты levels и class, который идентифицирует его как фактор. ?vector определяет, что:

факторов не являются векторами

Путаница может возникнуть между is.atomic и is.vector где последний возвращает TRUE к объектам, которые не имеют, кроме названия атрибутов.

attributes(test) 
$levels 
[1] "aa" "bb" "cc" 

$class 
[1] "factor" 

is.atomic(test) 
[1] TRUE 
length(test) 
[1] 1 
is.vector(test) 
[1] FALSE 

вопрос может быть возвращен обратно, потому что если вы видите:

sapply(df, class) 
     n   s   b 
"numeric" "factor" "logical" 

почему R должен преобразовать класс объекта вы подмножество? с test <- df[1,"s"] вы подмножали фактор, и это то, что R возвращает вам. Может быть, иногда было бы лучше изменить это поведение ... может быть, но представьте, что в случае необходимости было бы создавать правила для подмножества, которые изменяют атрибуты class. Я считаю трудной задачей.