Если вы обрабатываете свою переменную фактора как это (для циклического цикла для каждого элемента), то информация, которую он хранит, является позицией значения, а само значение хранится в «уровнях». Вы можете думать об этом как о справочной таблице, основанной на позициях.
Если вы сделаете это:
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"
В этом случае ваша петля будет обрабатывать числовые переменные как числовые и символьные переменные в качестве символов без каких-либо проблем.
Я думаю, что самой неотложной первоначальной причиной было сэкономить место, но есть и другие причины сделать это так, а именно тот факт, что символьные строки часто представляют собой какой-то перечислимый тип. Но я думаю, что на это действительно должен ответить R-oldtimer, который был вокруг, когда эти решения принимались. –