0

这是我的问题:

myvec <- c(1, 2, 2, 2, 3, 3,3, 4, 4, 5, 6, 6, 6, 6, 7, 8, 8, 9, 10, 10, 10)

我想开发一个函数,可以根据我定义的类别数量来满足这个向量。

如果类别 1 所有 newvec 元素将是 1

如果类别是 2 那么

唯一的(myvec),即

1 = 1, 2 =2, 3 = 1, 4 = 2, 5 =1, 6 = 2, 7 = 1, 8 = 2, 9 = 1, 10 = 2

(这是奇数或偶数的情况)

如果类别为 3,则前三个数字将是 1:3,然后将重复模式。

1 = 1, 2 = 2, 3=3, 4=1, 5 = 2, 6 = 3, 7 =1, 8 = 2, 9 = 3, 10 =1 

如果类别为 4,则第一个数字将是 1:4,然后将重复模式

1 = 1, 2 = 2, 3= 3, 4 = 4, 5 = 1, 6 = 2, 7=3, 8=4, 9 =1, 10 = 2

类似地,对于 n 个类别,第一个 1:n,然后重复该模式。

4

2 回答 2

4

如果我正确理解了这个问题,这应该可以满足您的需求。您可以改变变量n以选择组数。

myvec <- c(1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 6, 6, 6, 6, 7, 8, 8, 9, 10, 10, 10)
out <- vector(mode="integer", length=length(myvec))
uid <- sort(unique(myvec))
n <- 3
for (i in 1:n) {
  s <- seq(i, length(uid), n)
  out[myvec %in% s] <- i
}
于 2012-04-26T13:01:16.663 回答
3

使用 R 的回收特性(如果向量长度不能被 n 整除,则会发出警告):

R> myvec <- c(1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 6, 6, 6, 6, 7, 8, 8, 9, 10, 10, 10)
R> n <- 3
R> y <- cbind(x=sort(unique(myvec)), y=1:n)[, 2]
R> y
 [1] 1 2 3 1 2 3 1 2 3 1

或使用rep

R> x <- sort(unique(myvec))
R> y <- rep(1:n, length.out=length(x))
R> y
 [1] 1 2 3 1 2 3 1 2 3 1

更新:你可以只使用模运算符

R> myvec
 [1]  1  2  2  2  3  3  3  4  4  5  6  6  6  6  7  8  8  9 10 10 10
R> n <- 4
R> ((myvec - 1) %% n) + 1
 [1] 1 2 2 2 3 3 3 4 4 1 2 2 2 2 3 4 4 1 2 2 2
于 2012-04-26T13:20:10.010 回答