[英]R: Aggregate Data Table
我怎樣才能以最快的方式做到這一點,因為我在列中有很多值
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]
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
最快的方法是使用二分查找
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
並嘗試您自己的代碼。
你可以做:
cols = unique(dt[,AER])
colsWith1 = c('AMS','BLL','BLQ','BRE')
dt[ , (cols) := lapply(cols, function(u) as.integer(AER %chin% intersect(colsWith1, u))), .SDcols = cols]
# 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 = data.table(
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)
)
您希望實現的目標與這篇文章相似。 將@Sven Hohenstein 的答案改編為您的符號,它將變成:
cbind(dt,model.matrix(~0+AER,dt))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.