[color=rgba(0, 0, 0, 0.75)]R语言入门——离散的高维变量的数据生成
b9 R) _! D) `- D7 W目录- 0引言
- 1、函数代码及其结果
- 1.1、固定取值空间的情况
- 案例1.1
- 案例1.2
! ^: g& l5 I, `6 K
- 1.2、每个参数空间长度不固定
- 案例2.1
- 案例2.2
- 案例2.3% n) [7 N2 v* g- e% ^
3 \9 o9 [* f1 M
- 2、总结
4 H3 k$ c% c2 D" i& H$ Q C0 i" ~6 ~
6 u# w: b9 N9 q C
; c# l# z: x7 m {( I6 D: t0引言今天应同学需求,写了个关于生成任意高维离散参数的组合数据。具体要求如下: - 需要生成k个取值离散参数
- 每一个参数取值有限- _5 Q/ g. \8 k% J! \( s
为了更好的理解需求,给出一个比较常见的例子。由X1和X2两个参数,每个参数取值为0和1。需要生成的结果如下:6 T1 t! L5 B: {* _
[color=rgba(0, 0, 0, 0.75)]X1X22 Y3 h) P0 Q2 n2 d" k) ?1 u' o) p+ w
00- w6 z$ \1 J/ v c, f
01
* \3 Q; b1 M. W- z6 `% ~11
9 H( h1 h& l1 Z. w10
1 |7 T0 X' t. r) H+ n) U) Q" f, {但是想产生任意维度,每个维度的取值空间不同的数据该怎么办?下面是我的解决方案和大家分享一下。 1、函数代码及其结果1.1、固定取值空间的情况为了找寻思路先来个情况比较特殊的。嘿嘿,不多解释直接上代码: # 1、参数空间固定# n是参数个数,C是每个参数的取值空间fun <- function(n = 3, C = C){ Data <- c() p = length(C) for(i in 1:n){ Data <- cbind(Data, rep(C, each = p^(n-i), time = p^(i-1))) } Data}- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
k: i C$ \7 L9 h+ A8 |
接下来是这个代码使用案例: 案例1.1## 参数空间# 生成数据> C <- c(0, 2, 3)> # 两个参数> fun(n = 2, C = C) [,1] [,2] [1,] 0 0 [2,] 0 2 [3,] 0 3 [4,] 2 0 [5,] 2 2 [6,] 2 3 [7,] 3 0 [8,] 3 2 [9,] 3 3> fun(n = 3, C = C) # 增加变量个数 [,1] [,2] [,3] [1,] 0 0 0 [2,] 0 0 2 [3,] 0 0 3 [4,] 0 2 0 [5,] 0 2 2 [6,] 0 2 3 [7,] 0 3 0 [8,] 0 3 2 [9,] 0 3 3[10,] 2 0 0[11,] 2 0 2[12,] 2 0 3[13,] 2 2 0[14,] 2 2 2[15,] 2 2 3[16,] 2 3 0[17,] 2 3 2[18,] 2 3 3[19,] 3 0 0[20,] 3 0 2[21,] 3 0 3[22,] 3 2 0[23,] 3 2 2[24,] 3 2 3[25,] 3 3 0[26,] 3 3 2[27,] 3 3 3- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 448 s0 r! K3 p8 `3 s* }
案例1.2# 改变空间> C <- c(0, 2, 3, 4)> fun(n = 2, C = C) [,1] [,2] [1,] 0 0 [2,] 0 2 [3,] 0 3 [4,] 0 4 [5,] 2 0 [6,] 2 2 [7,] 2 3 [8,] 2 4 [9,] 3 0[10,] 3 2[11,] 3 3[12,] 3 4[13,] 4 0[14,] 4 2[15,] 4 3[16,] 4 4- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 206 ^7 E! i' ^. L6 ~1 U; s4 k
1.2、每个参数空间长度不固定依然直接给出函数: fun2 <- function(n = 3, ...){ arg = list(...) p <- c() for(k in 1:n){ p[k] <- length(arg[[k]]) } Data <- c() for(i in 1:n){ Data <- cbind(Data, rep(arg[], each = prod(p)/prod(p[1:i]), time = prod(p[1:i])/p)) } Data}- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
7 l4 ?" M# ?: B$ R 案例2.1两个参数,空间长度不同。 # 生成数据> C1 <- c(1, 2)> C2 <- c(3, 4, 5)> C3 <- c(6, 7)> # 函数调用> fun2(n = 2, C1, C2) [,1] [,2][1,] 1 3[2,] 1 4[3,] 1 5[4,] 2 3[5,] 2 4[6,] 2 5- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13. q3 ^7 s3 n# O3 p9 G; A2 [) i- p7 B
案例2.2两个参数,空间长度相同,可以发现对于空间长度相同的参数也可以使用fun2来实现。 # 注:数据使用案例2.1中的数据> fun2(n = 2, C1, C3) [,1] [,2][1,] 1 6[2,] 1 7[3,] 2 6[4,] 2 7- 1
- 2
- 3
- 4
- 5
- 6
- 7
5 r! ^9 O% [; d" Q! v7 ` 案例2.3三个参数,不同状态空间。 # 注:数据使用案例2.1中的数据> fun2(n = 3, C1, C2, C3) [,1] [,2] [,3] [1,] 1 3 6 [2,] 1 3 7 [3,] 1 4 6 [4,] 1 4 7 [5,] 1 5 6 [6,] 1 5 7 [7,] 2 3 6 [8,] 2 3 7 [9,] 2 4 6[10,] 2 4 7[11,] 2 5 6[12,] 2 5 7- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15. l8 \5 `, V. s2 p8 L8 s X- j
2、总结上述函数的核心思想在于对rep函数的each和time参数的灵活应用以及高中数列的知识。再写不同参数空间的数据生成函数fun2时,还应该注意输入参数...的使用使函数使用更加方便。
' N6 [& s' A. Q+ @0 j# p% D最后欢迎大家发现错误及时在评论区指出,若有更好的方法在评论区域给出一起学习探讨。 4 o( P- L7 P9 h- @% i6 j
2 D, L) s8 f9 R( `+ R |