It is possible to set up a polynomial ring so that the degree of an element is a vector of integers. For this, the option
Degrees is used, together with a list of degrees for the variables in the ring. Each degree is itself a list of integers. The degrees given must all be of the same length, and length zero is allowed, to get an ungraded ring.
i1 : R = ZZ/101[a,b,c,Degrees=>{{1,2},{2,1},{1,0}}]
o1 = R
o1 : PolynomialRing

i2 : describe R
ZZ
o2 = [a..c, Degrees => {{1}, {2}, {1}}, Heft => {1, 0}, MonomialOrder => {MonomialSize => 32 }]
101 {2} {1} {0} {GRevLex => {1..2, 1}}
{Position => Up }

i3 : degree a
o3 = {1, 2}
o3 : List

i4 : degree b^2
o4 = {4, 2}
o4 : List

i5 : degree 0_R
o5 = infinity
o5 : InfiniteNumber

i6 : degree 1_R
o6 = {0, 0}
o6 : List

A random element of bidegree
{m,n} can be obtained with
random.
i7 : random({15,15},R)
5 5 6 3 3 7 6
o7 =  30a b  36a b c + 24a b*c
o7 : R

The function
degree applied to a polynomial will return the least upper bound of the degrees of its monomials.
i8 : degree (a+b)
o8 = {2, 2}
o8 : List

We may recover the number of integers in each degree list for our ring as follows.
i9 : degreeLength R
o9 = 2

i10 : degreeLength ZZ
o10 = 0

One restriction on degrees of variables is that the entries be small integer values, possibly zero or negative. The notion of small depends on the size of exponents one wants: the degree of each monomial occurring should fit in a 32 bit integer (or 64 bit integer, on 64 bit machines).
Another restriction on degrees, at least if all the computational facilities of Macaulay2 are needed, is that a heft vector exists for them. A heft vector is a list of integers whose length is the same as the length of the degrees (see degreeLength), such that its dot product with the degree of each variable is positive. Heft vectors are computed automatically for you, as in the following example, or they may be provided by the user (see Heft).
i11 : R = QQ[a,b,c,Degrees=>{{1,0},{2,1},{3,1}}];

i12 : random({1,1},R)
1 3 9 4
o12 = a b + a c
2 4
o12 : R

i13 : basis({1,1},R)
o13 =  a4c a3b 
1 2
o13 : Matrix R < R

The heft vector computed behind the scenes is available to the user.
i14 : (options R).Heft
o14 = {1, 4}
o14 : List

If the heft vector is not provided, many computations will work (e.g., Gröbner bases and computation of resolutions), but certain other operations (such as basis and random) will raise errors.