重塑R中的数据,转换函数参数

时间:2017-04-05 09:15:58

标签: r reshape

我有一个名为“wc”的数据框,格式如下

PARENT_MOL_CHEMBL_ID    TARGET_TYPE
C10                      ABL 
C10                      EGFR
C939                     TP53

我想以下列格式重塑矩阵: 期望的输出

PARENT_MOL_CHEMBL_ID  ABL  EGFR  TP53
C10                     1    1     0
C939                    0    0     1

我在R中读过reshape包。 我尝试过调用强制转换功能,但它不起作用。

cast(wc,PARENT_MOL_CHEMBL_ID~TARGET_TYPE, value = "TARGET_TYPE")

我不明白我应该在值部分使用什么参数。请指导我如何将data.frame转换为所需的形状。

如果有更好的替代品,如plyr功能,请同样强调替代品。谢谢

2 个答案:

答案 0 :(得分:4)

OP要求帮助cast()包的reshape函数的参数。但是,reshape包已被同一包作者的reshape2包取代。根据包描述,reshape2包是

  

重新整形包重新启动

使用reshape2,可以使用

生成所需的结果
reshape2::dcast(wc, PARENT_MOL_CHEMBL_ID ~ TARGET_TYPE, fun.aggregate = length, 
                value.var = "TARGET_TYPE")
#  PARENT_MOL_CHEMBL_ID ABL EGFR TP53
#1                  C10   1    1    0
#2                 C939   0    0    1

BTW:data.table包也实现了(并增强了)dcast()。因此,使用

可以产生相同的结果
data.table::dcast(wc, PARENT_MOL_CHEMBL_ID ~ TARGET_TYPE, fun.aggregate = length, 
                  value.var = "TARGET_TYPE")

其他栏目

数据框中的OP mentioned其他列应与 spread wide 数据一起显示。不幸的是,OP还没有提供特定的样本数据,因此我们必须考虑两个用例。

案例1:附加列与id列

一起出现

数据看起来像

wc
#  PARENT_MOL_CHEMBL_ID TARGET_TYPE extra_col1
#1                  C10         ABL          a
#2                  C10        EGFR          a
#3                 C939        TP53          b

请注意extra_col1中的值与PARENT_MOL_CHEMBL_ID一致。

这是一个简单的案例,因为dcast()中的公式接受...,它代表公式中未使用的所有其他变量:

reshape2::dcast(wc, ... ~ TARGET_TYPE, fun.aggregate = length, 
                value.var = "TARGET_TYPE")
#  PARENT_MOL_CHEMBL_ID extra_col1 ABL EGFR TP53
#1                  C10          a   1    1    0
#2                 C939          b   0    0    1

生成的data.frame确实包含所有其他列。

案例2:其他列与id列一起

现在,又添加了一列:

wc
#  PARENT_MOL_CHEMBL_ID TARGET_TYPE extra_col1 extra_col2
#1                  C10         ABL          a          1
#2                  C10        EGFR          a          2
#3                 C939        TP53          b          3

请注意,extra_col2C10的两个不同值。这将导致简单的方法失败。因此,必须实施两步方法:首先重新整形,然后与原始数据框一起加入。现在,data.table包用于这两个步骤:

library(data.table)
# reshape from long to wide, result has only one row per id column
wide <- dcast(setDT(wc), PARENT_MOL_CHEMBL_ID ~ TARGET_TYPE, fun.aggregate = length, 
                value.var = "TARGET_TYPE")
# right join, i.e., all rows of wc are included
wide[wc, on = "PARENT_MOL_CHEMBL_ID"]
#   PARENT_MOL_CHEMBL_ID ABL EGFR TP53 TARGET_TYPE extra_col1 extra_col2
#1:                  C10   1    1    0         ABL          a          1
#2:                  C10   1    1    0        EGFR          a          2
#3:                 C939   0    0    1        TP53          b          3

结果以宽格式显示聚合值以及任何其他列。

答案 1 :(得分:1)