2016-01-26 4 views
1

Как сгенерировать новый столбец в data.table, основанный на нескольких условиях?Как создать новый столбец в data.table на основе нескольких условий?

Если в среде data.frame, я могу использовать ниже коды.

df<-data.frame(a=c(1,2,3,4,5,6,7,8,9,10),b=c(10,20,30,40,50,60,70,80,90,100)) 
df$c<-ifelse(df$b<=30,"G1", 
      ifelse(df$b>30 & df$b<=60, "G2", 
        ifelse(df$b>60 & df$b<=80, "G3", 
          ifelse(df$b>80 & df$b<=90, "G4","G5")))) 

В data.table среде, я знаю, что могу использовать

dt<-data.table(a=c(1,2,3,4,5,6,7,8,9,10),b=c(10,20,30,40,50,60,70,80,90,100)) 
dt[,d:=...] 

, чтобы создать новый столбец. Но как сгенерировать df $ c в dt с помощью dt [, d: = ...]?


Какая глупость я? Я не пытался. Ниже одной работы.

dt<-data.table(a=c(1,2,3,4,5,6,7,8,9,10),b=c(10,20,30,40,50,60,70,80,90,100)) 
dt[,d:=ifelse(b<=30,"G1", 
       ifelse(b>30 & b<=60, "G2", 
        ifelse(b>60 & b<=80, "G3", 
          ifelse(b>80 & b<=90, "G4","G5"))))] 

Благодаря

+0

попробовать 'дт [, "С": = ...]' , не стесняйтесь отвечать и принимать – jangorecki

+0

, если вы имеете в виду все эти * ifelse * - вы пытались удалить только 'dt $' и поставить как RHS ': ='? – jangorecki

+0

Те несколько операторов ifelse следует заменить на «cut» –

ответ

5

Для случаев, связанных с перекодировкой на основе диапазона значений базовой функции cut сильно помогает:

dt[,d:= cut(b, c(-Inf, 30, 60, 80, 90, Inf), paste0("G", 1:5))] 
+0

Я предполагаю, что вы подразумевали «числовые значения», когда вы говорили «диапазон значений»? Спасибо за подсказку на 'cut', это очень полезно :) –

+0

Спасибо. Эта функция очень полезна. – kzhang12

+0

добро пожаловать. если это поможет вам принять ответ с галочкой слева –