我怎样才能以最快的方式做到这一点,因为我在列中有很多值
columns <- levels(dt$AER)
dt[, (columns) := 0]
dt[AER=="AMS", AMS :=1]
dt[AER=="BLL", BLL :=1]
dt[AER=="BLQ", BLQ :=1]
dt[AER=="BRE", BRE :=1]
答案 0 :(得分:3)
dt = data.table(AER = c("ZZZ", "AMS", "AMS", "BLL", "BLQ", "BLQ",
"BRE"))
dt[, idx := .I]
# use dcast.data.table before 1.9.5
dcast(dt, idx + AER ~ AER, fill = 0, fun = function(x) 1)
# idx AER AMS BLL BLQ BRE ZZZ
#1: 1 ZZZ 0 0 0 0 1
#2: 2 AMS 1 0 0 0 0
#3: 3 AMS 1 0 0 0 0
#4: 4 BLL 0 1 0 0 0
#5: 5 BLQ 0 0 1 0 0
#6: 6 BLQ 0 0 1 0 0
#7: 7 BRE 0 0 0 1 0
答案 1 :(得分:2)
最快的方法是使用二进制搜索
library(data.table)
dt <- data.table(AER = c("AMS","BLL","BLQ","BRE"), AMS = 0, BLL = 0, BLQ = 0, BRE = 0)
setkey(dt,AER)
dt["AMS", AMS :=1]
dt["BLL", BLL :=1]
dt["BLQ", BLQ :=1]
dt["BRE", BRE :=1]
如果您使用1.9.5甚至不需要这样做,它使用auto.index
功能,在第一次过滤AER=="AMS"
之后,它将在场景后面构建一个索引并在每个下一个中重复使用它过滤 - 甚至使用==
运算符 - 都在场景后面。您可以设置options("datatable.verbose"=TRUE)
以查看其工作时间和方式。因此,如果您使用的是1.9.5,只需转动verbose=TRUE
并尝试使用自己的代码。
答案 2 :(得分:1)
你可以这样做:
cols = unique(dt[,AER])
colsWith1 = c('AMS','BLL','BLQ','BRE')
dt[,cols:=lapply(cols, function(u) (dt[,AER] %in% colsWith1 & dt[,AER] %in% u) +0L), with=F]
# AER ZZZ AMS BLL BLQ BRE
#1: ZZZ 0 0 0 0 0
#2: AMS 0 1 0 0 0
#3: AMS 0 1 0 0 0
#4: BLL 0 0 1 0 0
#5: BLQ 0 0 0 1 0
#6: BLQ 0 0 0 1 0
#7: BRE 0 0 0 0 1
数据:强>
dt = structure(list(AER = c("ZZZ", "AMS", "AMS", "BLL", "BLQ", "BLQ",
"BRE"), ZZZ = c(0L, 0L, 0L, 0L, 0L, 0L, 0L), AMS = c(0L, 1L,
1L, 0L, 0L, 0L, 0L), BLL = c(0L, 0L, 0L, 1L, 0L, 0L, 0L), BLQ = c(0L,
0L, 0L, 0L, 1L, 1L, 0L), BRE = c(0L, 0L, 0L, 0L, 0L, 0L, 1L)), .Names = c("AER",
"ZZZ", "AMS", "BLL", "BLQ", "BRE"), row.names = c(NA, -7L), class = c("data.table",
"data.frame"), .internal.selfref = <pointer: 0x03c124a0>)
答案 3 :(得分:1)
您希望实现的目标与this帖子类似。 根据@Sven Hohenstein对你符号的回答,它会变成:
cbind(dt,model.matrix(~0 + AER,dt))