2014-02-13 6 views
3

У меня есть фрейм данных с некоторыми столбцами:нескольких уровней коды, как два фактора этикетка

  • , что я хочу, чтобы превратиться в фактор,
  • , в которой различные уровни кодируются как -2, -1, 0, 1, 2, 3, 4
  • для которых я хочу уровни быть помечены как 0 или 1 после этой конвенции:

    -2 = 1 
    -1 = 1 
    0 = 0 
    1 = 1 
    2 = 1 
    3 = 1 
    4 = 0 
    

У меня есть следующий код:

#Convert to factor 
dat[idx] <- lapply(dat[idx], factor, levels = -2:4, labels = c(1, 1, 0, 1, 1, 1, 0)) 

#Drop unused factor levels 
dat <- droplevels(dat) 

Это работает, но это дает мне следующее предупреждение:

In `levels<-`(`*tmp*`, value = if (nl == nL) as.character(labels) else paste0(labels, : 
duplicated levels in factors are deprecated 

Я попытался следующий код (за предложение Ананды Mahto), но не повезло:

levels(dat[idx]) <- list(`0` = c(0, 4), `1` = c(-2, -1, 1, 2, 3)) 

Я понял, что должен быть лучший способ сделать это, любые предложения?

Мои данные выглядит следующим образом:

structure(list(Timestamp = structure(c(1380945601, 1380945603, 
1380945605, 1380945607, 1380945609, 1380945611, 1380945613, 1380945615, 
1380945617, 1380945619), class = c("POSIXct", "POSIXt"), tzone = ""), 
FCB2C01 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), RCB2C01 = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0), FCB2C02 = c(1, 1, 1, 1, 1, 1, 
1, 1, 1, 1), RCB2C02 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), FCB2C03 = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0), RCB2C03 = c(0, 0, 0, 0, 0, 0, 
0, 0, 0, 0), FCB2C04 = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), RCB2C04 = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0), FCB2C05 = c(1, 1, 1, 1, 1, 1, 
1, 1, 1, 1), RCB2C05 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), FCB2C06 = c(1, 
1, 1, 1, 1, 1, 1, 1, 1, 1), RCB2C06 = c(0, 0, 0, 0, 0, 0, 
0, 0, 0, 0), FCB2C07 = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), RCB2C07 = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0), FCB2C08 = c(1, 1, 1, 1, 1, 1, 
1, 1, 1, 1), RCB2C08 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), FCB2C09 = c(1, 
1, 1, 1, 1, 1, 1, 1, 1, 1), RCB2C09 = c(0, 0, 0, 0, 0, 0, 
0, 0, 0, 0), FCB2C10 = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), RCB2C10 = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0)), .Names = c("Timestamp", "FCB2C01", 
"RCB2C01", "FCB2C02", "RCB2C02", "FCB2C03", "RCB2C03", "FCB2C04", 
"RCB2C04", "FCB2C05", "RCB2C05", "FCB2C06", "RCB2C06", "FCB2C07", 
"RCB2C07", "FCB2C08", "RCB2C08", "FCB2C09", "RCB2C09", "FCB2C10", 
"RCB2C10"), row.names = c(NA, 10L), class = "data.frame") 

А индекс столбца:

idx <- seq(2,21,2) 

ответ

4

Если я правильно понимаю, что вы хотите сделать, «правильный» способ будет использовать levels чтобы указать свои уровни. Сравните следующее:

set.seed(1) 
x <- sample(-2:4, 10, replace = TRUE) 

YourApproach <- factor(x, levels = -2:4, labels = c(1, 1, 0, 1, 1, 1, 0)) 
# Warning message: 
# In `levels<-`(`*tmp*`, value = if (nl == nL) as.character(labels) else paste0(labels, : 
# duplicated levels in factors are deprecated 
YourApproach 
# [1] 1 0 1 0 1 0 0 1 1 1 
# Levels: 1 1 0 1 1 1 0 

xFac <- factor(x, levels = -2:4) 
levels(xFac) <- list(`0` = c(0, 4), `1` = c(-2, -1, 1, 2, 3)) 
xFac 
# [1] 1 0 1 0 1 0 0 1 1 1 
# Levels: 0 1 

Обратите внимание на разницу в уровнях «Уровни» в каждом из них. Это также означает, что базовое числовое представление будет другим:

> as.numeric(YourApproach) 
[1] 2 3 5 7 2 7 7 5 5 1 
> as.numeric(xFac) 
[1] 2 1 2 1 2 1 1 2 2 2 
+0

Я пробовал 'уровни' с моим фреймом данных, но это не сработало. Я редактировал свой вопрос с примера моих данных. – amzu

+0

Я не понимаю, почему подход OP к уровню факторов группировки не работает. Похоже, что использование 'factor' &' labels' является естественным подходом к группировке меток, в отличие от двухэтапного процесса объявления фактора и переопределения меток. Странный. Есть ли какая-то двусмысленность, которую я не вижу? – MichaelChirico

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