2014-12-23 2 views
2

У меня есть следующие данные и код, где я пытаюсь изменить порядок уровней (от a, b, c до c, a, b) символьного столбца, преобразуя его в фактор и изменение уровней. Однако он также меняет значения:Изменение уровней столбца символов в R

> mydf$new = c('a','b','a','c','b') 
> mydf 
    vnum1 vnum2 vch1 new 
1: 0.6 0.7 B a 
2: -1.4 0.5 E b 
3: 0.7 0.9 A a 
4: -0.3 0.8 C c 
5: -0.8 0.6 C b 
> 
> str(mydf) 
Classes ‘data.table’ and 'data.frame': 5 obs. of 4 variables: 
$ vnum1: num 0.6 -1.4 0.7 -0.3 -0.8 
$ vnum2: num 0.7 0.5 0.9 0.8 0.6 
$ vch1 : Factor w/ 4 levels "A","B","C","E": 2 4 1 3 3 
$ new : chr "a" "b" "a" "c" ... 
- attr(*, ".internal.selfref")=<externalptr> 
> 
> mydf$new = as.factor(mydf$new) 
> str(mydf$new) 
Factor w/ 3 levels "a","b","c": 1 2 1 3 2 
> levels(mydf$new)= c('c','a','b') 
> str(mydf$new) 
Factor w/ 3 levels "c","a","b": 1 2 1 3 2 
> mydf 
    vnum1 vnum2 vch1 new 
1: 0.6 0.7 B c 
2: -1.4 0.5 E a 
3: 0.7 0.9 A c 
4: -0.3 0.8 C b 
5: -0.8 0.6 C a 

Вся колонка «новая» была изменена. Как я могу сделать это правильно?

+2

'фактор (mydf $ новые, уровни = с ("с", "а", "б"))' 'не as.factor' – thelatemail

+0

Я думаю, что это будет «mydf [, new: = factor (c ('a', 'b', 'a', 'c', 'b'), levels = c (" c "," a "," b "))] []' –

+0

@RichardScriven: Мне нужно изменить существующий столбец. – rnso

ответ

2

Вы не можете просто изменить уровни. Вы в основном просто переименовываете метки уровней таким же образом, как вы меняете имена столбцов data.frame, когда вы делаете names(mydf)<-c("x","y"). Что вы хотите, чтобы создать новый фактор, который различный порядок

mydf$new <- factor(mydf$new, levels=c('c','a','b')) 
1

уровень Вы можете также использовать relevel сделать определенный уровень первым в списке.

> mydf<-data.frame("h"=c(1,2,3,4,5),"var1"=c(1.2,3,4,21,1),"new"=c('a','b','a','c','b')) 
> mydf$new = as.factor(mydf$new) 
#> mydf 
# h var1 new 
#1 1 1.2 a 
#2 2 3.0 b 
#3 3 4.0 a 
#4 4 21.0 c 
#5 5 1.0 b 
#> str(mydf$new) 
# Factor w/ 3 levels "a","b","c": 1 2 1 3 2 
#> levels(mydf$new) 
#[1] "a" "b" "c" 

>mydf$new <- relevel(mydf$new, "c")    #makes "c" the first level 
#> levels(mydf$new) 
#[1] "c" "a" "b" 
#> str(mydf$new) 
# Factor w/ 3 levels "c","a","b": 2 3 2 1 3 
#> mydf 
# h var1 new 
#1 1 1.2 a 
#2 2 3.0 b 
#3 3 4.0 a 
#4 4 21.0 c 
#5 5 1.0 b 
2

Я думаю, вы можете использовать синтаксис таблицы данных для этого. Начиная с

mydf 
# vnum1 vnum2 vch1 new 
# 1: 0.6 0.7 B a 
# 2: -1.4 0.5 E b 
# 3: 0.7 0.9 A a 
# 4: -0.3 0.8 C c 
# 5: -0.8 0.6 C b 

Вы можете сделать

mydf[, new := factor(new, levels = c("c", "a", "b"))][] 
# vnum1 vnum2 vch1 new 
# 1: 0.6 0.7 B a 
# 2: -1.4 0.5 E b 
# 3: 0.7 0.9 A a 
# 4: -0.3 0.8 C c 
# 5: -0.8 0.6 C b 
str(mydf) 
# Classes ‘data.table’ and 'data.frame': 5 obs. of 4 variables: 
# $ vnum1: num 0.6 -1.4 0.7 -0.3 -0.8 
# $ vnum2: num 0.7 0.5 0.9 0.8 0.6 
# $ vch1 : Factor w/ 4 levels "A","B","C","E": 2 4 1 3 3 
# $ new : Factor w/ 3 levels "c","a","b": 2 3 2 1 3 
# - attr(*, ".internal.selfref")=<externalptr> 
Смежные вопросы