[英]Product of list of columns in R data.table
我有一個 R data.table 的大量列名(變量)列表,我想創建一個包含這些列的乘積的列。
例子:
col_names <- c("season_1","season_2","season_3")
DT_example <- data.table(id=1:4,
season_1=c(1,1,0,0),
season_2=c(0,1,1,1),
season_3=c(1,0,1,0),
product=1)
數據表:
id season_1 season_2 season_3 product
1: 1 1 0 1 1
2: 2 1 1 1 1
3: 3 0 1 1 1
4: 4 0 1 0 1
我的解決方案是使用“for”循環,但效率不高:
for(inc in col_names){
nm1 <- as.symbol(inc)
DT_example[,product:= product * eval(nm1)]
}
結果:
id season_1 season_2 season_3 product
1: 1 1 0 1 0
2: 2 1 1 0 0
3: 3 1 1 1 1
4: 4 0 1 0 0
是否有使用 data.table 本機語法執行此操作的更快方法?
這里有四個選項。 第一個是迄今為止最有效的,但假設我們只處理零和一。
DT_example[, product := do.call(pmin, .SD), .SDcols = patterns("season")]
DT_example[, product := Reduce(`*`, .SD), .SDcols = patterns("season")]
DT_example[, product := apply(.SD, 1, prod), .SDcols = patterns("season")]
DT_example[, product := melt(.SD, id.vars = "id")[, prod(value), by = id]$V1]
# > DT_example
# id season_1 season_2 season_3 product
# 1: 1 1 0 1 0
# 2: 2 1 1 1 1
# 3: 3 0 1 1 0
# 4: 4 0 1 0 0
數據:
DT_example <- data.table(
id=1:4,
season_1=c(1,1,0,0),
season_2=c(0,1,1,1),
season_3=c(1,1,1,0),
product=1
)
在.SDcols
選擇列后,我們可以使用按行順序分組的prod
。 使用prod
,如果需要,還有na.rm
選項可以刪除NA
元素。
DT_example[, Product := prod(.SD, na.rm = TRUE), by = 1:nrow(DT_example),
.SDcols = patterns("season")]
-輸出
DT_example
# id season_1 season_2 season_3 product Product
#1: 1 1 0 1 1 0
#2: 2 1 1 1 1 1
#3: 3 0 1 1 1 0
#4: 4 0 1 0 1 0
我認為您可以使用“應用”和“產品”功能:
DT_example$product = apply(DT_example[,2:4], 1, prod)
這是將“prod”函數(將 ir 接收到的每個元素相乘)應用於“DT_example[,2:4]”的每一行(由“1”參數定義,因為“2”將是列)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.