基于具有0/1值的现有列的​​模态添加新列

时间:2018-02-20 09:29:10

标签: r data.table

假设我在data.table SENSIBILITE中有列TYPE_PEAUDataIns

> unique(DataIns$SENSIBILITE)
[1] "Fréquente"     "Occasionnelle" "Aucune"

> unique(DataIns$TYPE_PEAU)
[1] "Mixte"   "Sèche"   "Normale" "Grasse"

如您所见,每列都有很多形式。然后我想基于它创建新列,根据每个观察的模态具有二进制值。换句话说,如果我有:

> head(DataIns[,c("SENSIBILITE","TYPE_PEAU")])
     SENSIBILITE TYPE_PEAU
1:     Fréquente     Mixte
2:     Fréquente     Mixte
3:     Fréquente     Sèche
4: Occasionnelle     Mixte
5: Occasionnelle     Mixte
6:        Aucune   Normale

我需要得到结果:

> head(DataIns)
   TYPE_PEAU_M TYPE_PEAU_N TYPE_PEAU_S TYPE_PEAU_G SENSIBILITE_A SENSIBILITE_O SENSIBILITE_F
1:           1           0           0           0             0             0             1
2:           1           0           0           0             0             0             1
3:           0           0           1           0             0             0             1
4:           1           0           0           0             0             1             0
5:           1           0           0           0             0             1             0
6:           0           1           0           0             1             0             0

我使用此代码获得上述结果:

DataIns<-DataIns[,.(TYPE_PEAU_M=as.factor(ifelse(TYPE_PEAU=="Mixte", 1, 0)),
                 TYPE_PEAU_N=as.factor(ifelse(TYPE_PEAU=="Normale", 1, 0)),
                 TYPE_PEAU_S=as.factor(ifelse(TYPE_PEAU=="Sèche", 1, 0)),
                 TYPE_PEAU_G=as.factor(ifelse(TYPE_PEAU=="Grasse", 1, 0)),
                 SENSIBILITE_A=as.factor(ifelse(SENSIBILITE=="Aucune", 1, 0)),
                 SENSIBILITE_O=as.factor(ifelse(SENSIBILITE=="Occasionnelle", 1, 0)),
                 SENSIBILITE_F=as.factor(ifelse(SENSIBILITE=="Fréquente", 1, 0)))]

但是我认为当我有很多列和模态时,这个方法很长! 因此,我正在使用 data.table 操作以更快速,更自动的方式搜索,以获得有效的结果。

感谢您的建议!

3 个答案:

答案 0 :(得分:2)

由于您已经在使用data.table,因此您可以使用加在一起的dcastsubstr并使用dcast内的# create a row number column first DT[, rn := .I][] # double dcast & join dcast(DT, rn ~ paste0('TYPE_PEAU_', substr(TYPE_PEAU,1,1)), value.var = 'TYPE_PEAU', fun = length)[dcast(DT, rn ~ paste0('SENSIBILITE_', substr(SENSIBILITE,1,1)), value.var = 'SENSIBILITE', fun = length), on = .(rn)] 来获取所需的列名称:

   rn TYPE_PEAU_G TYPE_PEAU_M TYPE_PEAU_N TYPE_PEAU_S SENSIBILITE_A SENSIBILITE_F SENSIBILITE_O
1:  1           0           1           0           0             0             1             0
2:  2           0           1           0           0             0             1             0
3:  3           0           0           0           1             0             1             0
4:  4           0           1           0           0             0             0             1
5:  5           0           1           0           0             0             0             1
6:  6           0           0           1           0             1             0             0
7:  7           1           0           0           0             1             0             0

给出:

dcast(DT, other + rn ~ paste0('TYPE_PEAU_', substr(TYPE_PEAU,1,1)), value.var = 'TYPE_PEAU',
      fun = length)[dcast(DT, other + rn ~ paste0('SENSIBILITE_', substr(SENSIBILITE,1,1)), value.var = 'SENSIBILITE', fun = length)
                    , on = .(rn, other)]

如果要包含其他列,可以执行以下操作:

tp <- dcast(DT, rn ~ paste0('TYPE_PEAU_', substr(TYPE_PEAU,1,1)), value.var = 'TYPE_PEAU', fun = length)
sen <- dcast(DT, rn ~ paste0('SENSIBILITE_', substr(SENSIBILITE,1,1)), value.var = 'SENSIBILITE', fun = length)

DT[tp,  on = .(rn)][sen, on = .(rn)]

或者您想要包含所有列的其他选项:

DT <- fread("SENSIBILITE TYPE_PEAU
Fréquente     Mixte
Fréquente     Mixte
Fréquente     Sèche
Occasionnelle     Mixte
Occasionnelle     Mixte
Aucune   Normale
Aucune   Grasse")[, other := sample(LETTERS, 7)]

使用过的数据:

head = {
   "type":"FeatureCollection",
   "features":[
      {
         "type":"Feature",
         "id":4,
         "geometry":{
            "type":"Point",
            "coordinates":[
               -0.1044968729335983,
               51.52014078866054
            ]
         },
         "properties":{
            "description":"Фаррингдон-стрит",
            "iconCaption":"Фаррингдон-стрит",
            "marker-color":"#b51eff"
         }
      }
   ]
}

答案 1 :(得分:0)

您可以为每个SENSIBILITE和TYPE_PEAU使用dcast.data.table。然后合并结果。

d1 <- dcast.data.table(dat, I ~ TYPE_PEAU, length)
setnames(d1, names(d1)[-1], paste0("TYPE_PEAU_", names(d1)[-1]))

d2 <- dcast.data.table(dat, I ~ SENSIBILITE, length)
setnames(d2, names(d2)[-1], paste0("SENSIBILITE_", names(d2)[-1]))

d1[d2, on=.(I)][, 
    I := NULL]

数据:

dat <- fread("SENSIBILITE TYPE_PEAU
    Fréquente     Mixte
    Fréquente     Mixte
    Fréquente     Sèche
Occasionnelle     Mixte
Occasionnelle     Mixte
       Aucune   Normale")[,
           I := .I]

答案 2 :(得分:0)

为每个和cbind创建虚拟:

 library(dummies)

 data <- data.frame(
     SENSIBILITE=c("Fréquente", "Fréquente", "Fréquente", "Occasionnelle", "Occasionnelle", "Aucune "),
     TYPE_PEAU=c("Mixte", "Mixte", "Sèche", "Mixte", "Mixte", "Normale")
 )
 s <- dummy(data$SENSIBILITE, sep = "_")
 t <- dummy(data$TYPE_PEAU, sep = "_")
 cbind(s, t)