R 将长数据帧值拆分为具有重复列的较小帧值

R 将长数据帧值拆分为具有重复列的较小帧值,r,dataframe,matrix,bioinformatics,R,Dataframe,Matrix,Bioinformatics,我使用的是vcfR软件包。我必须将重复的列值拆分为垂直显示输出的相同列 例如: Sample Chr p-value AF MQ Sample Chr p-value AF MQ Sample Chr p-value AF MQ A1 1 0.0533 30 40 A1 1 0.0633 35 45 A1 2 0.0753 35 45 我正在努力获得输出 Sample Chr p-value AF MQ

我使用的是vcfR软件包。我必须将重复的列值拆分为垂直显示输出的相同列

例如:

Sample Chr p-value AF MQ   Sample Chr p-value AF MQ   Sample Chr p-value AF MQ    
A1      1  0.0533  30 40     A1    1  0.0633  35 45    A1     2  0.0753  35 45
我正在努力获得输出

Sample    Chr    p-value    AF     MQ
A1         1     0.0533     30     40  
A1         1     0.0633     35     45  
A1         2     0.0753     35     45

我尝试使用groupby函数,sapply函数,但无法获得上面在帧中显示的输出。请帮助..

您可以创建列索引列表,访问列集合以获取列表,然后在列表中重新查找元素

numCols <- unique(diff(which(colnames(df)=="Sample")))
indices <- split(seq_len(ncol(df)), ceiling(seq_len(ncol(df))/numCols))
do.call(rbind, lapply(indices, function(x) {
    df[,x]      
}))

以下是另一种解决方案:

df = read.table(text='Sample Chr p-value AF MQ   Sample Chr p-value AF MQ   Sample Chr p-value AF MQ    
A1      1  0.0533  30 40     A1    1  0.0633  35 45    A1     2  0.0753  35 45',header=T,check.names=F)

library(data.table)
group = ave(seq(ncol(df)), colnames(df), FUN = seq_along)
rbindlist(lapply(seq(max(group)), function(x) {df[,which(group==x)]}),fill=T)
输出:

   Sample Chr p-value AF MQ
1:     A1   1  0.0533 30 40
2:     A1   1  0.0633 35 45
3:     A1   2  0.0753 35 45
请注意,这要求每个组中没有不重复的列。如果有,您应该删除列,例如
df=df[,colnames(df)%in%unique(colnames(df)[复制(colnames(df))])]


希望这有帮助

您能用
dput
发布该示例数据吗?它是私有数据。我有一个很长的数据集,其中每个字段都包含很多参数。我分离了参数,并将它们转置到矩阵中。现在我必须把这个矩阵变成更小的框架,在这个框架中,很少有col和它们的值。如果col重复,则其对应值将在相应col下拆分,但col标题不会出现。正如示例中提到的,正是我所需要的输出。这看起来像是一个非常宽的data.frame,不是一个长的吗?是的,它很宽,有重复的col及其值。我必须将各个列的值放在列名称下,以防止它们重复。如果您能向我们展示生成输出的vcfR代码,可能会有更好的方法。谢谢,但这里我展示了5个列。我有更多的感冒,比如>50/60。。这个COL是动态的,它会随着每个数据集而变化。在这种情况下,我将如何划分?您的意思是我们如何获得列的数量而不是硬编码为5?类似于
unique(diff(colnames(df)=“Sample”)
?在wide data.frame中,我已经有了列名称及其值。它直接从数据集读取(预处理),到目前为止我得到的最终输出是。。假设在V1中我有所有的列名称,V2中我有所有的值。它们很宽,因为我使用了转置func。现在我必须拆分它们,如图所示,V1将有col name而不重复col name(如图所示),V2将包含o/p。那么您正在尝试从长宽格式转换?查看
重塑::dcast
数据表::dcast.data.table
tidyr::spread
。你真的需要更新你的问题。
do.call(rbind, lapply(split(df2$V2, cumsum(df2$V1=="Sample")), t))
df = read.table(text='Sample Chr p-value AF MQ   Sample Chr p-value AF MQ   Sample Chr p-value AF MQ    
A1      1  0.0533  30 40     A1    1  0.0633  35 45    A1     2  0.0753  35 45',header=T,check.names=F)

library(data.table)
group = ave(seq(ncol(df)), colnames(df), FUN = seq_along)
rbindlist(lapply(seq(max(group)), function(x) {df[,which(group==x)]}),fill=T)
   Sample Chr p-value AF MQ
1:     A1   1  0.0533 30 40
2:     A1   1  0.0633 35 45
3:     A1   2  0.0753 35 45