R 如何创建计数数据帧
我试图在r中创建一个如下所示的数据帧R 如何创建计数数据帧,r,R,我试图在r中创建一个如下所示的数据帧 X Y Z 3 1 1 3 1 2 3 1 3 3 2 1 3 2 2 3 2 3 4 1 1 4 1 2 4 1 3 4 2 1 ... 所以z列最多计数3,当它达到3列时,y列的增量为1,z列再次计数,直到3。然后x增加1,过程再次开始您可以使用expand.grid+rev rev(expand.grid(z = 1:3, y = 1:2, x = 3:4))
X Y Z
3 1 1
3 1 2
3 1 3
3 2 1
3 2 2
3 2 3
4 1 1
4 1 2
4 1 3
4 2 1
...
所以z列最多计数3,当它达到3列时,y列的增量为1,z列再次计数,直到3。然后x增加1,过程再次开始您可以使用
expand.grid
+rev
rev(expand.grid(z = 1:3, y = 1:2, x = 3:4))
x y z
1 3 1 1
2 3 1 2
3 3 1 3
4 3 2 1
5 3 2 2
6 3 2 3
7 4 1 1
8 4 1 2
9 4 1 3
10 4 2 1
11 4 2 2
12 4 2 3
一个选项是使用
tidyr::crossing()
就你而言:
交叉(X=3:4,
Y=1:2,
Z=1:3)
除了扩展.grid方法之外,这里还有另一个基本的R解决方案
下面这段代码的特点是,您只需将所有内容放入列表lst
,并将其传递给函数f
:
f <- function(lst) data.frame(mapply(function(p,n) rep(p,each=n),lst, prod(lengths(lst))/cumprod(lengths(lst))))
lst<- list(x = 3:4,y = 1:2,z = 1:3)
res <- f(lst)
A
数据表
完整性解决方案:
data.table::CJ(x=3:4,y=1:2,z=1:3)
x y z
1: 3 1 1
2: 3 1 2
3: 3 1 3
4: 3 2 1
5: 3 2 2
6: 3 2 3
7: 4 1 1
8: 4 1 2
9: 4 1 3
10: 4 2 1
11: 4 2 2
12: 4 2 3
与OP相比,您的解决方案多了2行。@sindri_baldur OP有垂直点表示有更多行
f <- function(lst) data.frame(mapply(function(p,n) rep(p,each=n),lst, prod(lengths(lst))/cumprod(lengths(lst))))
lst<- list(x = 3:4,y = 1:2,z = 1:3)
res <- f(lst)
> res
x y z
1 3 1 1
2 3 1 2
3 3 1 3
4 3 2 1
5 3 2 2
6 3 2 3
7 4 1 1
8 4 1 2
9 4 1 3
10 4 2 1
11 4 2 2
12 4 2 3