Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何创建计数数据帧_R - Fatal编程技术网

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

我试图在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
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