Вот решение с data.table
:
library("data.table")
D <- fread(
" X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 var
48 0 65 16 40 85 43 74 25 17 i
29 74 19 11 34 65 94 72 10 75 x1
21 66 78 4 76 86 85 59 17 27 x2
19 87 55 100 51 38 33 63 94 10 x3
67 37 86 69 50 90 98 22 18 46 v1
67 47 28 82 96 66 100 57 99 47 v2
82 5 38 27 14 87 36 9 9 86 v3
66 6 18 43 24 96 94 95 79 0 g1
52 79 69 82 89 58 46 28 30 8 g2
0 49 24 16 79 86 53 86 23 51 g3"
)
var_comb <- c("i,x1,v1,g1", "i,x1,v1,g2")
L <- strsplit(var_comb, ",")
myfun <- function(Rows) {
sapply(D[var %in% Rows, -11], prod)
}
sapply(L, myfun)
data.table(var_comb, t(sapply(L, myfun)))
Функция myfun()
принимает вектор символов указателей строки.D[var %in% Rows, -11]
выбирает строки с использованием вектора логического индекса и игнорирует 11-й столбец.sapply(..., prod)
вычисляет произведение для каждого столбца.
Чтобы сгенерировать все комбинации для var_comb
, выполните:
expand.grid("i", paste0("x", 1:3), paste0("v", 1:3), paste0("g", 1:3))
Таким образом, вы можете собрать его вместе:
Var_Comb <- expand.grid("i", paste0("x", 1:3), paste0("v", 1:3), paste0("g", 1:3))
apply(Var_Comb, 1, myfun)
var_comb <- apply(Var_Comb, 1, paste0, collapse=',')
data.table(var_comb, t(apply(Var_Comb, 1, myfun)))
дляоснование R:
setDF(D) ## only needed for using the data.table D from above
var_comb <- c("i,x1,v1,g1", "i,x1,v1,g2")
L <- strsplit(var_comb, ",")
myfun <- function(Rows) {
sapply(D[D$var %in% Rows, -11], prod)
}
sapply(L, myfun)
data.frame(var_comb, t(sapply(L, myfun)))
и (аналогично варианту data.table):
Var_Comb <- expand.grid("i", paste0("x", 1:3), paste0("v", 1:3), paste0("g", 1:3))
apply(Var_Comb, 1, myfun)
var_comb <- apply(Var_Comb, 1, paste0, collapse=',')
data.table(var_comb, t(apply(Var_Comb, 1, myfun)))