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(1,2)或c(2,1)的数字。它不可能是c(1.5,1.5)c(2,2,2)
- “非均匀”指的是大小的数量被倾斜,以将
分配给索引中的所有位置,但其中一个位置将包含提醒。例如,对于索引为1
3的
大小,它现在将是6
或1,1和4的任意组合c(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