R 基于第二列中的值拆分整数,分配新值,然后重新组合到新数据集中

R 基于第二列中的值拆分整数,分配新值,然后重新组合到新数据集中,r,list,split,R,List,Split,在R中,我有一个包含所有整数的2xn数据矩阵 第一列表示项目的大小。其中一些大小是由于合并造成的,因此第二列指示进入该大小的项目数(包括1)(称之为“索引”)。指数之和表示原始数据中实际有多少项 现在,我需要创建一个新的数据集,该数据集根据索引中的数字将任何合并的大小拆分回来,从而生成一个2xn向量(根据索引的总数创建一个新的长度n),第二列全部为1 我需要这种分裂以两种方式发生 “均匀”指将任何合并大小尽可能均匀地分配给索引数量。例如,索引为3的6大小现在将是c(2,2,2)重要的是,所有数

R
中,我有一个包含所有整数的
2xn
数据矩阵

第一列表示项目的大小。其中一些大小是由于合并造成的,因此第二列指示进入该大小的项目数(包括1)(称之为“索引”)。指数之和表示原始数据中实际有多少项

现在,我需要创建一个新的数据集,该数据集根据索引中的数字将任何合并的大小拆分回来,从而生成一个
2xn
向量(根据索引的总数创建一个新的长度
n
),第二列全部为1

我需要这种分裂以两种方式发生

  • “均匀”指将任何合并大小尽可能均匀地分配给索引数量。例如,索引为
    3
    6
    大小现在将是
    c(2,2,2)
    重要的是,所有数字都必须是整数,所以它应该是类似于c(1,2)或c(2,1)的数字。它不可能是c(1.5,1.5)
  • “非均匀”指的是大小的数量被倾斜,以将
    1
    分配给索引中的所有位置,但其中一个位置将包含提醒。例如,对于索引为
    3的
    6
    大小,它现在将是
    c(1,1,4)
    或1,1和4的任意组合
下面我将提供一些示例数据,举例说明我拥有的、我想要的和我尝试过的

#我拥有的示例数据
Y.have
库(分区)
是为这种类型的需求创建的,请查看。
将下面的逻辑应用到您的代码中,它应该可以工作

ex:

hom <- restrictedparts(19,3)  #where 19 is Y.have[,1][1] and 3 is Y.have[,2][1] as per your data 
print(hom[,ncol(hom)])

#output : 7 6 6

het <- Reduce(intersect, list(which(hom[2,1:ncol(hom)] %in% 1),which(hom[3,1:ncol(hom)] %in% 1)))
hom[,het]

#output : 17 1 1

hom一个选项是使用整数除法(%/%)和模数(%)。它可能不会给出您指定的确切结果,即8和3给出(2,2,4)而不是(3,3,2),但通常会按照您的描述执行

Y.have<-cbind(c(19,1,1,1,1,4,3,1,1,8),c(3,1,1,1,1,2,1,1,1,3))

homoVec <- c()
for (i in 1:length(Y.have[,1])){
  if (Y.have[i,2] == 1) {
    a = Y.have[i,1]
    homoVec <- append(homoVec, a)
  } else {
    quantNum <- Y.have[i,1]
    indexNum <- Y.have[i,2]
    b <- quantNum %/% indexNum
    c <- quantNum %% indexNum
    a <- c(rep(b, indexNum-1), b + c)
    homoVec <- append(homoVec, a)
  }
}

homoOut <- data.frame(homoVec, 1)

heteroVec <- c()
for (i in 1:length(Y.have[,1])){
  if (Y.have[i,2] == 1) {
    a = 1
    heteroVec <- append(heteroVec, a)
  } else {
    quantNum <- Y.have[i,1]
    indexNum <- Y.have[i,2]
    firstNum <- quantNum - (indexNum - 1)
    a <- c(firstNum, rep(1, indexNum - 1))
    heteroVec <- append(heteroVec, a)
  }
}

heteroOut <- data.frame(heteroVec, 1)

Y.have这里可能有一种方法

为同质和异质拆分创建两个函数:

get_hom_ints <- function(M, N) {
  vec <- rep(floor(M/N), N)
  for (i in seq_len(M - sum(vec))) {
    vec[i] <- vec[i] + 1
  }
  vec
}

get_het_ints <- function(M, N) {
  vec <- rep(1, N)
  vec[1] <- M - sum(vec) + 1
  vec
}
输出

(异质性)

(同质)


这是一个完美而优雅的解决方案。在这两种情况下,似乎您首先分配了最简单的向量值,然后返回并添加了更复杂的内容(即在“ho'm”中添加额外的
1
,在“het”中添加剩余值)。感谢您在此处提供帮助,同时也感谢您将来如何处理解决方案!
get_hom_ints <- function(M, N) {
  vec <- rep(floor(M/N), N)
  for (i in seq_len(M - sum(vec))) {
    vec[i] <- vec[i] + 1
  }
  vec
}

get_het_ints <- function(M, N) {
  vec <- rep(1, N)
  vec[1] <- M - sum(vec) + 1
  vec
}
het_vec <- unlist(apply(Y.have, 1, function(x) get_het_ints(x[1], x[2]))) 
unname(cbind(het_vec, rep(1, length(het_vec))))

hom_vec <- unlist(apply(Y.have, 1, function(x) get_hom_ints(x[1], x[2])))
unname(cbind(hom_vec, rep(1, length(het_vec))))
      [,1] [,2]
 [1,]   17    1
 [2,]    1    1
 [3,]    1    1
 [4,]    1    1
 [5,]    1    1
 [6,]    1    1
 [7,]    1    1
 [8,]    3    1
 [9,]    1    1
[10,]    3    1
[11,]    1    1
[12,]    1    1
[13,]    6    1
[14,]    1    1
[15,]    1    1
      [,1] [,2]
 [1,]    7    1
 [2,]    6    1
 [3,]    6    1
 [4,]    1    1
 [5,]    1    1
 [6,]    1    1
 [7,]    1    1
 [8,]    2    1
 [9,]    2    1
[10,]    3    1
[11,]    1    1
[12,]    1    1
[13,]    3    1
[14,]    3    1
[15,]    2    1