2013-04-29 2 views
3

я следующие dataframe:перекодирования уровни факторов

forStack 
    AGE BMI time   A   B  ID 
1 59 23.8 0  (0,75] (4,14.9] 9000099 
2 69 29.8 0 (96.4,100] (-Inf,0] 9000296 
3 71 22.7 0 (75,89.3] (4,14.9] 9000622 
4 56 32.4 0  (0,75] (14.9,68] 9000798 
5 72 30.7 0  (0,75] (14.9,68] 9001104 
6 75 23.5 0 (96.4,100]  (0,4] 9001400 

dput (forStack) 
structure(list(AGE = c(59, 69, 71, 56, 72, 75), BMI = c(23.8, 
29.8, 22.7, 32.4, 30.7, 23.5), time = c(0, 0, 0, 0, 0, 0), A = structure(c(2L, 
5L, 3L, 2L, 2L, 5L), .Label = c("(-Inf,0]", "(0,75]", "(75,89.3]", 
"(89.3,96.4]", "(96.4,100]", "(100, Inf]"), class = "factor"), 
B = structure(c(3L, 1L, 3L, 4L, 4L, 2L), .Label = c("(-Inf,0]", 
"(0,4]", "(4,14.9]", "(14.9,68]", "(68, Inf]"), class = "factor"), 
ID = c(9000099, 9000296, 9000622, 9000798, 9001104, 9001400 
)), .Names = c("AGE", "BMI", "time", "A", "B", "ID"), row.names = c(NA, 
6L), class = "data.frame") 

Переменные A и B являются факторами, представляющие квартили:

forStack$A 
    [1] (0,75]  (96.4,100] (75,89.3] (0,75]  (0,75]  (96.4,100] 
    Levels: (-Inf,0] (0,75] (75,89.3] (89.3,96.4] (96.4,100] (100, Inf] 

    forStack$B 
    [1] (4,14.9] (-Inf,0] (4,14.9] (14.9,68] (14.9,68] (0,4]  
    Levels: (-Inf,0] (0,4] (4,14.9] (14.9,68] (68, Inf] 

Я хотел бы перекодировать A и B значения для факторов двухуровневых, как следует:

Для A верхние уровни факторов (96.4,100] и (100, Inf] должны быть перекодированы в качестве 0-го уровня, других уровней - в качестве 1-го уровня

Для B на самые низкие уровни фактора (-Inf,0] и (0,4] должны быть перекодированы в качестве 0-го уровня, других уровней - как 1-го уровня

Таким образом, dataframe должен выглядят так:

forStack 
    AGE BMI time   A   B  ID 
1 59 23.8 0   1   1 9000099 
2 69 29.8 0   0   0 9000296 
3 71 22.7 0   1   1 9000622 
4 56 32.4 0   1   1 9000798 
5 72 30.7 0   1   1 9001104 
6 75 23.5 0   0   0 9001400 

Каков наиболее эффективный способ сделать это? Большое спасибо заранее

ответ

6

Вот один подход:

within(forStack, { 
    A <- as.numeric(!A %in% tail(levels(A), 2)) 
    B <- as.numeric(!B %in% head(levels(B), 2)) 
}) 
# AGE BMI time A B  ID 
# 1 59 23.8 0 1 1 9000099 
# 2 69 29.8 0 0 0 9000296 
# 3 71 22.7 0 1 1 9000622 
# 4 56 32.4 0 1 1 9000798 
# 5 72 30.7 0 1 1 9001104 
# 6 75 23.5 0 0 0 9001400 

Основная идея здесь заключается в том, что head и tail оба имеют «n» аргумент, который позволяет указать, сколько значений вы хотите от " head "и" tail "вашего вектора или набора данных. Это позволяет нам легко захватить (96.4,100] и (100, Inf] для вектора А, а соответствующие значения для вектора В.

within удобный способ динамически заменить значения в вашем data.frame.

3

Как вы знаете, что факторы упорядочены, вы можете сделать следующее

within(forStack, { 
    Ar <- (as.integer(A) < length(levels(A))-1)*1 
    Br <- (as.integer(B) > 2)*1 
}) 
+0

Спасибо большое, Ананда Mahto и mnel! Ваши ответы очень полезны, как принять их обоих? – DSSS

+0

Это тоже очень приятно. +1 – A5C1D2H2I1M1N2O1R2T1

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