多行*行

Multiple rows * rows

我有一个样本数据集如下

variable=c("i","x1","x2","x3","v1","v2","v3","g1","g2","g3")
df=data.frame(replicate(10,sample(0:100,10,rep=TRUE)))
df$var=variable
df
  X1 X2 X3  X4 X5 X6  X7 X8 X9 X10 var
1  48  0 65  16 40 85  43 74 25  17   i
2  29 74 19  11 34 65  94 72 10  75  x1
3  21 66 78   4 76 86  85 59 17  27  x2
4  19 87 55 100 51 38  33 63 94  10  x3
5  67 37 86  69 50 90  98 22 18  46  v1
6  67 47 28  82 96 66 100 57 99  47  v2
7  82  5 38  27 14 87  36  9  9  86  v3
8  66  6 18  43 24 96  94 95 79   0  g1
9  52 79 69  82 89 58  46 28 30   8  g2
10  0 49 24  16 79 86  53 86 23  51  g3

这里列 var 是关键。我想要做的是生成一个 table ,其中每一行代表 i、Xs、Vs、Gs 的组合。例如,一行是

var_comb            X1      X2  .................X10              
"i,x1,v1,g1"       6155424
"i,x1,v1,g2"       4849728

那里的 X1 值是 (48*29*67*66) 即原始值 table 类似的第二个组合是 (48*29*67*52)

这样就有3*3*3 = 27行的组合。我如何生成所需的输出?

注意 x,v 和 g 就像不同的变量,1,2,3 是它们的级别。它们不必彼此相乘(即像 "i,x1,x2,v1" 这样的组合)但彼此相乘 - x 的每个唯一级别与 v 和 g 的唯一级别)

这是 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)))

and(与 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)))