簡體   English   中英

R:聚合數據表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM