根据R中另一个数据框中的元数据信息组合数据框列

Combine Dataframe columns based on metadata information in another dataframe in R

我这里的数据集在概念上与这个问题中的数据集相似:Hierarchical indexing in R dataframe but not this one: R: Combine columns based on different information in another column of a dataframe

我想根据另一个数据框中列的元数据信息,通过对它们求和来组合(或重新组合)我的 table 中的列。

这是我的数据集的示例

  organisms x1 x2 x3 x4 y1 y2 y3 y4
       cat   1  1  5  0  1  0  1  3
       dog   2  2  4  0  2  3  0  1
     mouse   3  0  3  2  3  2  1  0
      bird   4  3  2  1  2  7  2  0

这就是我想要展示它的一种方式

organisms Extreme NotExtreme
cat       7 5
dog       8 6
mouse     8 6
bird      10 11

organisms XLow XHigh YLow YHigh
cat         6    1     2     2    
dog         6    2     2     4
mouse       6    2     4     2
bird        6    4     4     7

这是加载我的数据集的代码

metadata <- data.frame(sample = c("x1","x2","x3","x4","y1","y2","y3","y4"), treatment = c(rep("Xtreme",4),rep("NotExtreme",4)),dosage=c(rep(c("Xlow","Xhigh"),2),rep(c("Ylow","YHigh"),2)))
mydata <- data.frame(x1 = c(1,2,3,4), x2 = c(1,2,0,3), x3=c(5,4,3,2),x4=c(0,0,2,1),y1=c(1,2,3,2),y2=c(0,3,2,7),y3=c(1,0,1,2),y4=c(3,1,0,0))
rownames(mydata)<- c("cat","dog","mouse","bird")

是否有直接的一两个线性解决方案,或者我是否必须为此编写一个函数?我查看了 melt 函数和 dplyr 包,但这不是我想要的,因为我的数据已经包含在两个单独的 data.frames 中。这是一个依赖于列的操作。

Hierarchical indexing in R dataframe 问题在某种程度上与我的类似,但我对数据进行了重新表示,而不是将层次结构保留在同一数据框中。但是列之间的层次关系仍然存在。

任何有关如何实现优雅解决方案的见解都将不胜感激。

可能有更优雅的方法,但您可以通过基于元数据 df 中的值列表进行子集化然后对这些行值求和...

Exdf<-data.frame(Extreme=rowSums(mydata[,(colnames(mydata) %in% subset(metadata, treatment=="Xtreme")$sample==T)]),
             NotExtreme=rowSums(mydata[,(colnames(mydata) %in% subset(metadata, treatment=="NotExtreme")$sample==T)]))
LH<-data.frame(XLow=rowSums(mydata[,(colnames(mydata) %in% subset(metadata, dosage=="Xlow")$sample==T)]),
             XHigh=rowSums(mydata[,(colnames(mydata) %in% subset(metadata, dosage=="Xhigh")$sample==T)]),
           YLow=rowSums(mydata[,(colnames(mydata) %in% subset(metadata, dosage=="Ylow")$sample==T)]),
           YHigh=rowSums(mydata[,(colnames(mydata) %in% subset(metadata, dosage=="Yhigh")$sample==T)]))