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

时间:2017-02-07 06:43:05

标签: r dataframe hierarchical-data data-manipulation

此处的我的数据集在概念上与此问题中的数据集类似:Hierarchical indexing in R dataframe但不是这一个:R: Combine columns based on different information in another column of a dataframe

我想根据另一个数据帧中列的元数据信息,将表中的列组合(或重新组合),或者重新组合。

以下是我的数据集

的示例
  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")

是否有一个直接的一个或两个班轮解决方案或我是否必须为此编写功能?我研究了融合函数和dplyr包,但这不是我想要的,因为我的数据已经包含在两个独立的data.frames中。这是一个依赖于列的操作。

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

非常感谢任何有关如何处理优雅解决方案的见解。

1 个答案:

答案 0 :(得分:0)

可能有更优雅的方法,但您可以通过基于元数据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)]))