我的样本数据集如下
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的唯一级别)
答案 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)))
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)))