R:聚合数据表

时间:2015-04-21 10:18:22

标签: r data.table aggregate

我怎样才能以最快的方式做到这一点,因为我在列中有很多值

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]

4 个答案:

答案 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))