2015-06-03 4 views
0

У меня очень простой код, я не понимаю, почему не работает так, как я хочу. В принципе, у меня есть кадр данных и вы хотите захватить значение n-го элемента столбца в кадре данных и сохранить его в векторе. Вот мой код:Получение значений конкретных элементов кадра данных в R

COL1_VALUES <- c("ABC","XYZ","PQR") 
COL2_VALUES <- c("DEF","JKL","TSM") 

means <- data.frame(COL1_VALUES,COL2_VALUES) 

for (i in 1:nrow(means)) { 
    COL1_VALUES[i] <- means$COL1[i]; 
    COL2_VALUES[i] <- means$COL2[i]; 
} 

print(means$COL1) 
print(COL1_VALUES) 

Это выходы:

[1] ABC XYZ PQR 
Levels: ABC PQR XYZ 
[1] "1" "3" "2" 

Почему не я не получаю ABC XYZ TSM в векторе COL1_VALUES? Похоже, что 1, 3, 2 являются индексами ABC XYZ TSM в средствах $ COL1. Что мне нужно, чтобы получить ABC XYZ TSM в векторе COL1_VALUES?

Спасибо.

+2

'COL1_VALUES' как вектор является символом' character'. Когда он помещается в 'data.frame()', он преобразуется в 'factor' (поскольку' data.frame (..., strAsAsFactors = TRUE) 'по умолчанию). Я думаю, это объясняет вашу разницу. – thelatemail

+1

Я не понимаю, почему вы это делаете в первую очередь. Ваш код делает практически ничего полезного –

+0

@DavidArenburg это 100-кратная упрощенная версия моего фактического кода, чтобы представить пример. – Baykal

ответ

1

В R, data.frame() функция судов с установкой по умолчанию stringsAsFactors=TRUE. Это означает, что все входные символьные векторы неявно преобразуются в так называемые «факторы» при создании data.frame.

фактор несколько напоминает вектор с целыми числами + текстовые метки, которые описывают эти целые числа. Например, если столбец gender имеет тип factor это на самом деле вектор целых чисел 1 с и 2 с плюс прилагается словарь, который идентификатор категории 1 означает Male и идентификатор категории 2 означает Female или наоборот.

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

Ниже я перечисляю те функции, которые я лично боролся с до понимая, что все, что я хватает stringsAsFactors=FALSE вариант:

  • data.frame
  • read.csv, read.table и другие read.* функции
  • expand.grid

В вашем конкретном примере выше, что вы n ПЕД сделать, это найти строку:

means <- data.frame(COL1_VALUES,COL2_VALUES) 

и заменить его:

means <- data.frame(COL1_VALUES,COL2_VALUES, 
        stringsAsFactors=FALSE) 

таким образом, что вы явно запрашивающий data.frame() не делать какие-либо неявное преобразование за спиной.

Вы также можете избежать этого преобразования, изменив глобальный параметр в начале каждого R сессии:

options(stringsAsFactors = FALSE) 

Примечания, однако, что изменение этого глобального параметра влияет только на вашу машину и фрагменты кода может остановить работая на машинах других.

Этот answer содержит дополнительную информацию о том, как его постоянно отключать.