假设我在data.table SENSIBILITE
中有列TYPE_PEAU
和DataIns
。
> 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 操作以更快速,更自动的方式搜索,以获得有效的结果。
感谢您的建议!
答案 0 :(得分:2)
由于您已经在使用data.table
,因此您可以使用加在一起的dcast
加substr
并使用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)