多行*行
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)))
我有一个样本数据集如下
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)))