多行*行

时间:2019-01-30 11:22:41

标签: r dplyr reshape

我的样本数据集如下

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列是关键。我想做的是生成一张表格,其中每一行都显示i,Xs,Vs,Gs的组合。例如一行将是

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

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

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

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

1 个答案:

答案 0 :(得分:1)

这是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-variant中的相同):

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