2015-11-09 4 views
0

Я застрял на явно очень простой проблеме с переменными символа фактора.Получить значения символов вместо уровней факторов

test = data.frame(uv=c("03834","06044","06054","03834","48557","48207","03834","06044","48557")) 
test 
uv=c() 
for (i in 1:length(test$uv)){ 
    uv[i]=test[i,"uv"] 
} 
uv 

И это то, что я получаю:

> test = data.frame(uv=c("03834","06044","06054","03834","48557","48207","03834","06044","48557")) 
> test 
    uv 
1 03834 
2 06044 
3 06054 
4 03834 
5 48557 
6 48207 
7 03834 
8 06044 
9 48557 
> uv=c() 
> for (i in 1:length(test$uv)){ 
+ uv[i]=test[i,"uv"] 
+ } 
> uv 
[1] 1 2 3 1 5 4 1 2 5 
> 

Мой вопрос почему это сохранение номера уровня вместо значений символов?

Я знаю, что если я ставлю:

 uv[i]=as.character(test[i,"uv"]) 

, который работает, но в «реальной жизни», мои переменные могут быть числовыми, так что я не хочу, чтобы заставить его характер ...

Это как-то отсутствует в моем понимании факторов!

Спасибо.

+1

Я думаю, что самой неотложной первоначальной причиной было сэкономить место, но есть и другие причины сделать это так, а именно тот факт, что символьные строки часто представляют собой какой-то перечислимый тип. Но я думаю, что на это действительно должен ответить R-oldtimer, который был вокруг, когда эти решения принимались. –

ответ

2

Если вы обрабатываете свою переменную фактора как это (для циклического цикла для каждого элемента), то информация, которую он хранит, является позицией значения, а само значение хранится в «уровнях». Вы можете думать об этом как о справочной таблице, основанной на позициях.

Если вы сделаете это:

test = data.frame(uv=c("03834","06044","06054","03834","48557","48207","03834","06044","48557")) 
test 
uv= c() 
for (i in 1:length(test$uv)){ 
    uv[i]=test[i,"uv"] 
} 

uv 

# [1] 1 2 3 1 5 4 1 2 5 

factor(uv, labels = levels(test$uv)) 

# [1] 03834 06044 06054 03834 48557 48207 03834 06044 48557 
# Levels: 03834 06044 06054 48207 48557 

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

Если вы:

uv2 = test[,"uv"] 
uv2 

# [1] 03834 06044 06054 03834 48557 48207 03834 06044 48557 
# Levels: 03834 06044 06054 48207 48557 

Вы увидите, что uv2 имеет всю информацию, как вы не перебирать каждый элемент, но вы использовали столбец фактора в целом.

Не уверен, что вы подразумеваете под «числовой переменной в реальной жизни». В этом случае у вас не будет проблем, поскольку числовая переменная не является переменной фактора или символа.

test = data.frame(uv=c(03834,06044,06054,03834)) 
test 
uv= c() 
for (i in 1:length(test$uv)){ 
    uv[i]=test[i,"uv"] 
} 

uv 

# [1] 3834 6044 6054 3834 

Но вам не хватать нулей в начале номера.

Если вы предпочитаете работать с числовыми или символьными переменными, вы можете использовать опцию stringsAsFactors = F, которая гарантирует, что у вас не будет никаких переменных факторов.

test = data.frame(uv=c("03834","06044","06054","03834","48557","48207","03834","06044","48557"), 
        stringsAsFactors = F) 
test 
uv= c() 
for (i in 1:length(test$uv)){ 
    uv[i]=test[i,"uv"] 
} 

uv 

# [1] "03834" "06044" "06054" "03834" "48557" "48207" "03834" "06044" "48557" 

В этом случае ваша петля будет обрабатывать числовые переменные как числовые и символьные переменные в качестве символов без каких-либо проблем.

+1

Отлично! Это хороший урок. Теперь я понимаю, почему и как. Большое спасибо за ответ! – Sam

Смежные вопросы